我惊讶地发现.NET中的System.Numerics.Complex
数据类型不会产生数学上准确的结果。
Complex.Sqrt(-1) != Complex.ImaginaryOne
而不是(0,1),我得到(6.12303176911189E-17,1),看起来很像舍入错误。
现在我意识到浮点运算有时会导致这样的结果,但通常使用整数会避免舍入错误。
为什么这个看似基本的操作会产生明显错误的结果?
答案 0 :(得分: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)转换时,当实际坐标接近零时,舍入误差变为可见。