1

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

顶部 = 4.0107e+030

机器人 = 5.46725E26 -2.806428e26i

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

当我使用 Matlab 时,我得到以下信息:

顶部/底部 = 5.8060e+003 +2.9803e+003i

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

顶部/底部 = +5575.19343780947 +2676.09270239214i System.Numerics.Complex

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

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

4

1 回答 1

0

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

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

现在,当分母大于大约 1e+19 时,可能以一种避免计算平方的形式实现除法,但我们还没有在 Math.NET Numerics 中这样做(因为没有对它的需求到现在)。如果复杂类型实现极坐标形式,这也不是问题,但这并不常见。

于 2013-08-18T20:44:10.403 回答