签署零linux vs Windows

时间:2011-12-04 12:49:36

标签: c++ windows linux signed zero

我在Windows和Linux上运行c ++程序。 输出意味着相同。 我试图确保唯一的区别是真正的差异反对工作的隐私差异。 到目前为止,我已经处理了\ r \ n差异可能导致的所有差异 但有一件事我似乎无法弄明白。

在Windows中输出的是0.000,在linux中是-0.000

有没有人知道它能带来什么变化呢?

感谢名单

3 个答案:

答案 0 :(得分:7)

可能它来自优化器如何优化某些FP计算的差异(可以配置 - 参见例如here);在一种情况下,你得到一个略小于0的值,在另一种情况下稍微多一点。输出中的两个都四舍五入为0.000,但它们保持“真实”符号。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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