.NET"双"算术是否独立于平台/架构?

Tim*_*mwi 13 .net c#

如果我System.Double在Windows(x86和x64)下运行涉及.NET 的复杂计算,然后运行Mono(Linux,Unix,无论如何),我绝对保证在所有情况下得到完全相同的结果,或者规范允许一些计算的余地?

Bal*_*a R 14

来自MSDN

此外,使用Double值进行算术,赋值和解析操作所导致的精度损失可能因平台而异.例如,在32位和64位版本的.NET Framework中,分配文字Double值的结果可能不同

希望有所帮助.

  • 请注意,结果*始终保证符合IEEE-754标准,但该规范允许一定量的余地(例如,允许结果比指定的最小精度更精确). (3认同)

Cod*_*aos 5

不,它不一样.它可能编译为x87或SSE指令,这些指令的工作方式不同(例如关于denorm支持).我发现无法强制.net使用可重现的浮点数学.

有一些替代品,但所有这些都很慢,有些是很多工作:

  • 实现自己的浮点/定点数.
    • 32位固定不是很难编码.但它们的有限范围和精确度使它们难以使用.Log而且Sqrt会很慢.如果你愿意,我可以为此挖出我未完成的代码.
    • 64位定点更适合使用.但是你不能在字节码中以高性能方式轻松实现它们,因为一些中间值是96-128位,CLR不提供支持.
    • 浮点(我看看32位尾数和16位指数)很好用,但很难实现.由于为了避免精度损失,您需要快速找到最高的非零位.C#/ .net中没有BitScanForward/Reverse内在函数.
  • 将所有数学代码移动到本机库中,因为根据我的阅读,您可以强制大多数C++编译器创建可重现的浮点代码.
  • Decimal 用软件实现,因此也可以重现,但也不快.