【问题标题】:Can this double precision rounding error condition ever be reached?能否达到这种双精度舍入误差条件?
【发布时间】:2020-02-17 08:51:18
【问题描述】:

我在IronPython fork of the DLR找到了这行代码:

return value < 0.0 || 1.0 / value < 0.0 ? -0.0 : 0.0;

其中valuedouble。没有覆盖测试用例,因为 1.0 / double.MaxValue &gt; 0 我正在努力了解如何达到 1.0 / value &lt; 0.0 条件。

有什么想法吗?

编辑 我的意思是以一种有意义的方式达到,以便value &lt; 0.0 == false1.0 / value &lt; 0.0 == true

【问题讨论】:

    标签: c# double precision


    【解决方案1】:

    这个条件是为了捕捉value本身就是-0.0的情况。它确保当输入为-0.0时该方法返回-0.0

    条件-0.0 &lt; 0.0 为假,但1.0 / -0.0-∞-∞ &lt; 0.0 为真。

    因此,当value-0.0 时,1.0 / value &lt; 0.0 的计算结果为真,而value &lt; 0.0 的结果为假。

    你引用的那一行上面的评论支持这一点:

    // Preserve the sign of the input, including +/-0.0
    return value < 0.0 || 1.0 / value < 0.0 ? -0.0 : 0.0;
    

    浮点数很奇怪,尤其是在这种极端情况下。请参阅this answer 了解更多信息。

    【讨论】:

    • 领先我一秒。 :)
    • 不需要擦进去。:(
    • 对,但是你不会进入第二个分支,那段代码不会被命中,因为它是由第一个条件处理的。问题是当值非负时,1/value 怎么可能是负的。
    • 好的,谢谢。是的,这是有道理的,这就是他们要保护的条件。
    • 哦,这很尴尬,你完全正确,我的错。我看错了操作顺序。
    【解决方案2】:

    如果值为负,则为负。

    (1 / -0.5) = -2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2011-01-08
      相关资源
      最近更新 更多