好的,我有两个很大的复数值。顶部和底部:
Top = 4.0107e+030
Bot = 5.46725E26 -2.806428e26i
当我在Math.Net的Complex32中除以这两个数字时,它给出了一个真实和想象的NaN。我认为这与精确度有关。
当我使用Matlab时,我得到以下信息:
Top/Bot = 5.8060e+003 +2.9803e+003i
当我使用System.Numerics时,我得到了一些与matlab非常接近的信息,至少以正确的数量级表示:
Top/Bot = +5575.19343780947 +2676.09270239214i System.Numerics.Complex
我想知道哪一个是对的?为什么Math.Net给了我一个错误的答案,我正在运行模拟,我非常关心数字的准确性?反正是为了解决这个问题?我会处理大量的复杂数字。
另外,如果有人知道.net有一个很好的复杂库,并且支持特殊的函数,比如复杂错误函数和复杂参数的错误函数,那就太好了。我发现Math.Net不支持complex32的cerf
发布于 2013-08-18 20:44:10
如果您关心精度,显然应该使用双精度/64位类型,而不是单精度/32位类型。请注意,我们只在普通包中提供Complex32,而不提供复杂(64)类型,因为为了兼容性,我们希望您使用System.Numerics中提供的复杂类型--我们只在可移植构建中提供一个等效的复杂(64)类型,因为System.Numerics是不可用的。
--但在这种特殊情况下,这不是精度问题(或准确性问题),而是距离问题。请记住,32位浮点数不能大于~3.4e+38。以法向直接形式计算复数除法需要计算分母的实分量和虚分量的平方,在你的情况下,它将超出范围,变成“无穷大”,因此最终结果是NaN。
现在,可能可以在分母大于1e+19的情况下,以避免计算平方的形式实现除法,但我们还没有在Math.NET数字中这样做(因为到目前为止还没有对它的需求)。如果复杂类型实现极性形式,这也不是一个问题,但这是非常罕见的。
https://stackoverflow.com/questions/18297920
复制相似问题