我知道浮点数有精度,精度后面的数字不可靠。
但如果用于计算数字的方程相同怎么办?我可以假设结果也会相同吗?
例如我们有两个浮点数x
and y
。我们可以假设结果吗x/y
机器1的结果和机器2的结果完全一样吗? IE。==
比较将返回 true
但如果用于计算数字的方程相同怎么办?我可以假设结果也会相同吗?
不,不一定。
特别是,在某些情况下,JIT 被允许使用更准确的中间表示 - 例如当原始数据为 64 位时为 80 位 - 而在其他情况下则不会。当满足以下任一条件时,可能会导致看到不同的结果:
- 您的代码略有不同,例如使用局部变量而不是字段,这可以更改值是否存储在寄存器中。 (这是一个相对明显的例子;还有其他更微妙的例子可以影响事物,例如
try
阻止该方法...)
- 您正在不同的处理器上执行(我曾经观察 AMD 和 Intel 之间的差异;同一制造商的不同 CPU 之间也可能存在差异)
- 您正在使用不同的优化级别执行(例如,是否在调试器下)
来自 C# 5 规范第 4.1.6 节:
浮点运算可以以比运算结果类型更高的精度执行。例如,某些硬件体系结构支持具有比双精度类型更大的范围和精度的“扩展”或“长双精度”浮点类型,并使用这种更高精度类型隐式执行所有浮点运算。只有在性能方面付出过高的代价,这样的硬件架构才能以较低的精度执行浮点运算,并且 C# 允许对所有浮点运算使用更高精度的类型,而不是要求实现同时牺牲性能和精度。除了提供更精确的结果之外,这很少产生任何可测量的效果。然而,在形式的表达中x * y / z
,其中乘法产生的结果超出双精度范围,但随后的除法将临时结果带回到双精度范围内,以更高范围格式计算表达式的事实可能会导致产生有限结果,而不是无穷大。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)