C# Is.NET“;双倍”;算法独立于平台/架构?

C# Is.NET“;双倍”;算法独立于平台/架构?,c#,.net,C#,.net,如果我在Windows(x86和x64)和Mono(Linux、Unix等)下分别在.NET和Mono上运行一个涉及System.Double的复杂计算,我是否绝对保证在所有情况下都能得到完全相同的结果,或者规范是否允许在计算中留有一些余地? 此外,精度的损失 这是算术的结果, 赋值和解析操作 使用双值时,可能会因 站台。例如 指定一个文本双精度值可能会 不同于32位和64位 .NET Framework的版本 希望这能有所帮助。不,这不一样。它可能编译成工作方式不同的x87或SSE指令(例如,

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

此外,精度的损失 这是算术的结果, 赋值和解析操作 使用双值时,可能会因 站台。例如 指定一个文本双精度值可能会 不同于32位和64位 .NET Framework的版本


希望这能有所帮助。

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

有一些替代方案,但都很慢,有些需要大量工作:

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

    • 我不这么认为。例如:

      内部浮点数的大小 表示依赖于实现,可以变化,并且精度至少应与 被表示的变量或表达式

      以及:

      此设计允许CLI选择特定于平台的高性能表示形式 浮点数,直到它们被放入存储位置。例如,它可能可以离开 硬件寄存器中的浮点变量,提供比用户要求的精度更高的精度。在 同时,CIL生成器可以通过 转换指令的使用

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

      注意,结果始终保证符合IEEE-754,但该规范允许一定的回旋余地(例如,允许结果比指定的最小精度更精确)。