C# Is.NET“;双倍”;算法独立于平台/架构?
如果我在Windows(x86和x64)和Mono(Linux、Unix等)下分别在.NET和Mono上运行一个涉及C# Is.NET“;双倍”;算法独立于平台/架构?,c#,.net,C#,.net,如果我在Windows(x86和x64)和Mono(Linux、Unix等)下分别在.NET和Mono上运行一个涉及System.Double的复杂计算,我是否绝对保证在所有情况下都能得到完全相同的结果,或者规范是否允许在计算中留有一些余地? 此外,精度的损失 这是算术的结果, 赋值和解析操作 使用双值时,可能会因 站台。例如 指定一个文本双精度值可能会 不同于32位和64位 .NET Framework的版本 希望这能有所帮助。不,这不一样。它可能编译成工作方式不同的x87或SSE指令(例如,
System.Double
的复杂计算,我是否绝对保证在所有情况下都能得到完全相同的结果,或者规范是否允许在计算中留有一些余地?
此外,精度的损失
这是算术的结果,
赋值和解析操作
使用双值时,可能会因
站台。例如
指定一个文本双精度值可能会
不同于32位和64位
.NET Framework的版本
希望这能有所帮助。不,这不一样。它可能编译成工作方式不同的x87或SSE指令(例如,关于denorm支持)。我发现没有办法强迫.net使用可复制的浮点数学 有一些替代方案,但都很慢,有些需要大量工作:
- 实现您自己的浮点/定点数字。
- 32位固定的代码并不太难编写。但其有限的射程和精度使其难以使用<代码>日志和
将变慢。如果您愿意,我可以为此挖掘我未完成的代码。Sqrt
- 64位定点更适合使用。但您不能轻松地在字节码中以高性能的方式实现它们,因为有些中间值是96-128位,CLR不提供支持
- 浮点(我将研究32位尾数和16位指数)很好用,但很难实现。因为为了避免精度损失,您需要一种快速的方法来找到最高的非零位。而且C#/.net中没有BitScanForward/Reverse内部函数
- 32位固定的代码并不太难编写。但其有限的射程和精度使其难以使用<代码>日志和
- 将所有的数学代码移到本机库中,因为从我读到的,你可以强迫大多数C++编译器创建可重复的浮点代码。
是在软件中实现的,因此可能也是可复制的,但它也不快Decimal
- 我不这么认为。例如:
内部浮点数的大小
表示依赖于实现,可以变化,并且精度至少应与
被表示的变量或表达式
以及:
此设计允许CLI选择特定于平台的高性能表示形式
浮点数,直到它们被放入存储位置。例如,它可能可以离开
硬件寄存器中的浮点变量,提供比用户要求的精度更高的精度。在
同时,CIL生成器可以通过
转换指令的使用
根据MS分区的第12.1.3节,我倾向于指出,如果所有操作都发生在内部表示中,则可能会出现舍入差异注意,结果始终保证符合IEEE-754,但该规范允许一定的回旋余地(例如,允许结果比指定的最小精度更精确)。