Signed zero linux vs windows



我在Windows和linux上用c++运行一个程序。输出应该是相同的。我试图确保唯一的差异是真正的差异,而不是工作环境的差异。到目前为止,我已经处理了所有可能由rn差异引起的差异但有一件事我似乎弄不明白。

在Windows输出中有一个0.000,在Linux中是-0.000

有人知道是什么造成了差异吗?

谢谢

这可能来自于优化器如何优化一些FP计算的差异(可以配置-参见这里的例子);在一种情况下,你得到的值略小于0,在另一种情况下,你得到的值略大于0。输出中的两个都四舍五入到0.000,但它们保留其"real"符号。

由于在IEEE浮点格式中符号位与值是分开的,因此您有两个不同的0值,一个是正数,一个是负数。在大多数情况下,这并没有什么区别;两个零比较起来是相等的,它们确实描述了相同的数学值(数学上,0和-0是相同的)。当您有底流并且需要知道底流是从正值还是负值发生时,差异可能会很明显。同样,如果你除以0,你得到的无穷的符号取决于0的符号(即1/+0.0得到+Inf,但1/-0.0得到-Inf)。换句话说,很可能它不会对你有什么影响。

请注意,不同的输出并不一定意味着数字本身不同。很可能Windows中的值也是-0.0,但Windows上的输出例程并不区分+0.0和-0.0(毕竟它们比较相等)。

除非使用(不安全的)标志,如-ffast-math,否则编译器在优化 IEEE-754算法时可以做出的假设是有限的。首先检查两个平台是否使用相同的舍入。

如果可能的话,检查它们是否使用相同的浮点单位。例如,SSE与x86上的FPU。后者可能是数学库函数实现的一个问题——尤其是三角函数/超越函数。

最新更新