为什么结果如下:
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 ?有没有用他们用来执行浮点划分的方法来解决这个问题?
答案 0 :(得分:3)
JLS 15.17.2明确指出
将零除以零会导致 NaN ;零除以任何其他有限值导致有符号零。该标志由上述规则决定。
将零非零有限值除以零会产生有符号无穷大。该标志由上述规则决定。
JLS还说明了这些常数在操作中的区别。
如果任一操作数为 NaN ,则结果为 NaN 。
无穷大除以无穷大会导致 NaN 。
按有限值划分无穷大会产生带符号的无穷大。该标志由上述规则决定。
完全没有矛盾。
答案 1 :(得分:2)
根据数学定义,以下操作会导致未确定的结果,这就是 NAN 所代表的! 未确定的结果可能是:
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
是固定的分子。