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

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

来自MSDN

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

希望有所帮助。

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

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

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

我不相信。 这样的短语:

内部浮点表示的大小取决于实现,可以变化,并且其精度至少与表示的变量或表达式的精度一样大

和:

此设计允许CLI为浮点数选择特定于平台的高性能表示,直到它们被放置在存储位置。 例如,它可能能够将浮点变量保留在硬件寄存器中,这些变量提供的精度比用户请求的更高。 同时,CIL生成器可以通过使用转换指令强制操作遵守特定于语言的表示规则

从MS分区的第12.1.3节开始,我倾向于指出如果所有操作都在内部表示中发生,则可能发生舍入差异