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

时间:2011-02-16 14:19:27

标签: c# .net

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

3 个答案:

答案 0 :(得分:14)

来自MSDN

  

另外,精度损失   这是算术的结果,   赋值和解析操作   双值可能会有所不同   平台。例如,结果   分配文字Double值可以   32位和64位不同   .NET Framework的版本

希望有所帮助。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:0)

我不相信。这样的短语:

  

内部浮点的大小   表示是依赖于实现的,可以变化,并且应该具有至少与之相同的精度   表示的变量或表达式

  

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

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