【问题标题】:Double divide by zero: Why is the result inconsistent?双除以零:为什么结果不一致?
【发布时间】:2017-05-15 15:43:51
【问题描述】:

为什么会出现以下结果:

double a = 0.0/0.0;
double b = 0/0.0;

= NaN

但结果例如:

double e = 0.1/0.0;
double e = 12.0/0.0;
double f = 1.0/0.0;

= 无限

我了解double 或float 部门在某种程度上有所不同。我对生成的 NaN 感到非常满意,因为当某物被零除时,结果未定义。但是为什么他们定义大于零除以零的结果是Infitity?这与他们用来执行浮点除法的方法有关吗?

【问题讨论】:

  • 这与 JLS 15.17.2 的行为完全相同:“零除以零会导致 NaN...非零有限值除以零会导致有符号无穷大。”你会建议结果是什么?这很常见——甚至可能是 IEEE754 所要求的。
  • 所有这些数学表达式 0/0、∞/∞、0 × ∞、∞ - ∞、1∞ 和 ∞0。产生一个不确定的形式
  • @JonSkeet 我预计结果相同(均为 NaN)且不依赖于除法的分子。
  • @ClaudioP:那么基本上你的期望是不恰当的,因为它已经明确了它会做什么。您可能还想阅读stackoverflow.com/questions/14682005。

标签: java floating-point double


【解决方案1】:

JLS 15.17.2 明确指出

一个零除以一个零的结果是NaN;零除以任何其他有限值会导致有符号零。符号由上述规则确定。

非零有限值除以零会产生有符号无穷大。符号由上述规则确定。

JLS 还说明了这些常量在操作中的区别。

如果任一操作数为 NaN,则结果为 NaN。

infinity 除以 infinity 得到 NaN。

infinity 除以一个有限值会得到一个有符号的infinity。符号由上述规则确定。

一点都不矛盾。

【讨论】:

  • 解释 NaN 和 Infinity 的位表示没有帮助。提问者似乎很清楚 NaN 和 Infinity 的概念,只是不清楚结果的推理。
  • 感谢您的努力。如果有人能说明这个定义的原因,我会很高兴。为什么他们两个都不使用 NaN?
【解决方案2】:

根据数学定义,以下操作会导致未确定的结果,这就是 NAN 的含义! 以下未确定的结果可能是:

  • 0/0,
  • ∞/∞,
  • 0*∞,
  • ∞-∞,
  • 0^0,
  • 1^∞,
  • 0^∞

java 几乎都匹配(∞^0 和 0^0 除外)

    // 0/0
    double a = 0.0 / 0.0;
    System.out.println(a);
    // ∞/∞
    a = Double.POSITIVE_INFINITY / Double.POSITIVE_INFINITY;
    System.out.println(a);
    // 0*∞
    a = 0 * Double.POSITIVE_INFINITY;
    System.out.println(a);
    // ∞-∞
    a = Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY;
    System.out.println(a);
    // 0^0
    a = Math.pow(0, 0);
    System.out.println(a);
    // 1^∞
    a = Math.pow(1, Double.POSITIVE_INFINITY);
    System.out.println(a);
    // ∞^0
    a = Math.pow(Double.POSITIVE_INFINITY, 0);
    System.out.println(a);

【讨论】:

    【解决方案3】:

    还有其他答案指定这是标准中的,因此是“预期的”行为。你似乎想知道为什么标准是这样的。我猜原因是某些表达式具有明确定义的限制(如在微积分中),而有些表达式甚至没有限制。具有明确限制的那些获得有符号无穷大(因为那是限制)。像 0/0 这样的会得到 NaN,因为那里没有限制。 (左边的极限是负无穷大,右边的极限是正无穷大。)在所有情况下,当我说“极限”时,我的意思是limit of n/x as x -> 0,其中n 是固定分子。

    【讨论】:

    • 感谢您提供标准定义的可能原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2012-02-12
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多