8

我惊讶地发现System.Numerics.Complex.NET 中的数据类型并不能产生数学上准确的结果。

Complex.Sqrt(-1) != Complex.ImaginaryOne

我得到的不是 (0, 1),而是 (6.12303176911189E-17, 1),这看起来很像舍入错误。

现在我意识到浮点运算有时会导致这样的结果,但通常使用整数会避免舍入错误。

为什么这个看似基本的操作会产生明显错误的结果?

4

1 回答 1

10

看反编译的Sqrt方法。

public static Complex Sqrt(Complex value)
{
    return Complex.FromPolarCoordinates(Math.Sqrt(value.Magnitude), value.Phase / 2.0);
}

实际上,使用极坐标和弧度会导致舍入误差。value.Phase / 2.0将返回 pi/2,这不是一个完全可表示的数字。从极坐标 (1, pi/2) 转换时,当实坐标接近零时,舍入误差变得可见。

于 2012-10-09T19:16:57.983 回答