【问题标题】:Signed zero linux vs windows签名零 linux vs windows
【发布时间】:2011-12-04 12:49:35
【问题描述】:

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

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

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

感谢

【问题讨论】:

  • 很难说,因为你没有展示一段相关的代码输出:)
  • 不管你怎么看,它都没有区别。您将如何处理有符号/无符号零?添加它?复数吗?除以它?
  • @FailedDev:它确实有所作为。想想一个趋于 0 的函数,它既可以来自 y 轴的负值部分,也可以来自 y 轴的正值部分。

标签: c++ windows linux signed zero


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多