当我在Windows和Solaris上编译执行完全相同的浮点运算代码(使用双精度)时,我得到了略微不同的结果。
我知道由于舍入误差,结果并不完全准确。然而,我原本期望舍入误差是与平台无关的,因此在两个平台上会得到相同(稍有偏差)的结果,但事实并非如此。
这是正常现象吗?还是我的代码存在其他问题?
当我在Windows和Solaris上编译执行完全相同的浮点运算代码(使用双精度)时,我得到了略微不同的结果。
我知道由于舍入误差,结果并不完全准确。然而,我原本期望舍入误差是与平台无关的,因此在两个平台上会得到相同(稍有偏差)的结果,但事实并非如此。
这是正常现象吗?还是我的代码存在其他问题?
在x86上,通常大多数计算都使用80位的数量进行,除非被强制转换为双精度。我所知道的大多数其他架构都会使用双精度进行所有计算(除非另有规定)。
我不知道您是否在SPARC或x86上运行Solaris,但如果是前者,则我高度怀疑这是差异的原因。
1e16 + 2.9999
的内容,同时小心避免编译器常量折叠优化(例如定义单独的add
函数来执行加法,并关闭任何可能内联函数的优化)。当使用53位精度(SSE2或双精度模式的x87)时,这给出1e16 + 2;当使用64位精度(x87扩展精度模式)时,这会给出1e16 + 4。后者的结果来自称为“双重舍入”的效果,其中加法的结果首先舍入到64位,然后再舍入到53位。 (在Python中直接进行此计算时,在32位Linux上我得到1e16 + 4,而在Windows上我得到1e16 + 2,原因完全相同。)