Math.Net Complex32 Division给出了NaN

时间:2013-08-18 09:59:19

标签: complex-numbers mathdotnet

好吧,所以我有两个大的复杂值。顶部和底部:

顶部= 4.0107e + 030

Bot = 5.46725E26 -2.806428e26i

当我在Math.Net的Complex32中划分这两个数字时,它给了我一个真实和虚构的NaN。我假设它与精度有关。

当我使用Matlab时,我得到以下内容:

Top / Bot = 5.8060e + 003 + 2.9803e + 003i

当我使用System.Numerics时,我得到的东西非常接近matlabs,至少按照正确的大小顺序:

Top / Bot = +5575.19343780947 + 2676.09270239214i System.Numerics.Complex

我想知道哪一个是正确的?为什么Math.Net给了我一个错误的答案 我正在运行模拟,我非常关心数字的准确性? 有任何解决这个问题的方法吗?我将处理许多大型复杂数字。

另外,如果有人知道.net的一个好的复杂库,它支持特殊功能,例如复杂的错误函数和复杂参数的错误功能,那就太棒了。 我发现Math.Net不支持complex32的cerf

1 个答案:

答案 0 :(得分:0)

如果你关心精度,你应该明显使用双精度/ 64位类型,而不是单精度/ 32位。请注意,我们只在普通包中提供Complex32但不提供Complex(64)类型,因为我们希望您使用System.Numerics中提供的Complex类型来实现兼容性 - 我们仅在可移植构建中提供等效的Complex(64)类型System.Numerics不在那里。

但在这种特殊情况下,这不是精度(或准确度)的问题,而是关于范围。请记住,32位浮点数不能大于~3.4e + 38。以正常直接形式计算复数除法需要计算分母的实部和虚部的平方,在你的情况下,它将超出范围并变为“无穷大”,因此在最终结果中变为NaN。

现在,有可能以分母大于约1e + 19时避免计算平方的形式实现除法,但我们还没有在Math.NET Numerics中做到这一点(因为没有需求)到目前为止)。如果复杂类型实现极性形式,这也不会成为问题,但这种情况非常罕见。

相关问题