除以零:为什么结果不一致?

时间:2017-05-15 15:43:52

标签: java floating-point double

为什么结果如下:

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;

= 无限

我理解doublefloat分歧在某种程度上有点不同。我对结果 NaN 感到非常满意,因为当事物除以零时没有定义结果。但是为什么他们定义大于零除以零的结果是 Infitity ?有没有用他们用来执行浮点划分的方法来解决这个问题?

3 个答案:

答案 0 :(得分:3)

JLS 15.17.2明确指出

  

将零除以零会导致 NaN ;零除以任何其他有限值导致有符号零。该标志由上述规则决定。

     

将零非零有限值除以零会产生有符号无穷大。该标志由上述规则决定。

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

  

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

     

无穷大除以无穷大会导致 NaN

     

按有限值划分无穷大会产生带符号的无穷大。该标志由上述规则决定。

完全没有矛盾。

答案 1 :(得分: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);

答案 2 :(得分:1)

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