【发布时间】:2015-10-15 16:09:02
【问题描述】:
如果我运行语句
Math.Exp(113.62826122038274).ToString("R")
在安装了 .net 4.5.1 的机器上,然后我得到答案
2.2290860617259248E+49
但是,如果我在安装了 .net framework 4.5.2 的机器上运行相同的命令,那么我会得到答案
2.2290860617259246E+49
(即最后一位数字发生变化)
我意识到这在纯数字方面是微不足道的,但有谁知道 .net 4.5.2 中所做的任何更改可以解释这种更改?
(我不喜欢另一种结果,我只是想了解它为什么会改变)
如果我输出
The input in roundtrip format
The input converted to a long via BitConverter.DoubleToInt64Bits
Math.Exp in roundtrip format
Math.Exp converted to a long via BitConverter.DoubleToInt64Bits
然后在 4.5.1 我得到
113.62826122038274
4637696294982039780
2.2290860617259248E+49
5345351685623826106
在 4.5.2 上我得到:
113.62826122038274
4637696294982039780
2.2290860617259246E+49
5345351685623826105
所以对于完全相同的输入,我得到不同的输出(从位可以看出,因此不涉及往返格式)
更多细节:
使用VS2015编译一次
我运行二进制文件的两台机器都是 64 位的
一个安装了 .net 4.5.1,另一个安装了 4.5.2
只是为了清楚起见:字符串转换无关紧要......无论是否涉及字符串转换,我都会得到结果的变化。我提到这纯粹是为了展示这种变化。
【问题讨论】:
-
是否也安装了net46?
-
@AndreasMüller - 不,只有 4.5.2,尽管 4.6 与 4.5.2 的答案相同 - 更改似乎是由 4.5.2 而不是 4.6 引入的
-
@WaiHaLee 查看更新后的问题
-
浮点运算由 CPU 执行,而不是框架。 CPU有区别吗?差异也可能是由一个使用 FPU 的框架和另一个使用 SSE 的框架引起的。 4.5.2 没有做出这样的改变,但 4.6 确实引入了 SIMD 操作。 4.6 是 4.5 的二进制替换,所以 也许 这就是造成差异的原因
-
在我的机器上,
4.5.2我得到了你的第一个结果,最后一个数字以 8 结尾,而不是 6,2.2290860617259248E+49。
标签: c# precision .net-4.5.2