【问题标题】:Why is .NET's Complex type broken?为什么 .NET 的 Complex 类型会损坏?
【发布时间】:2012-09-30 04:31:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 字体没坏,没理由闹剧。
  • @HenkHolterman 嗯,这是我能找到的最好的形容词。
  • Double precision problems on .NET 和许多其他的可能重复。
  • @HenkHolterman 我知道。我知道浮点数是如何工作的。这是一个看起来应该可以工作的案例。
  • 鉴于 Complex.Sqrt(-1) 应该等于 Complex.ImaginaryOne,如果不是(不)等式检查,建议的比较操作是什么?

标签: c# .net complex-numbers


【解决方案1】:

查看反编译后的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) 转换时,当实坐标接近零时,舍入误差变得可见。

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 2019-10-23
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多