我们如何在代码中使用它们,以及什么会导致NaN(不是数字)的出现?
我们如何在代码中使用它们,以及什么会导致NaN(不是数字)的出现?
0/0
的结果。以下是 Float
类规范中的常量:
更多信息可以在 维基百科的 IEEE-754 页面 中找到。
这里有一个小程序来说明这三个常量:
System.out.println(0f / 0f);
System.out.println(1f / 0f);
System.out.println(-1f / 0f);
输出:
NaN
Infinity
-Infinity
这里是一个很好的参考,如果你想了解Java中浮点数的更多知识。
正无穷大是一个太大以至于无法正常表示的正数。负无穷大是一个太小以至于无法正常表示的负数。NaN表示“不是数字”,并且由于数学运算无法产生数字,例如将0除以0所得到。
在Java中,Double和Float类都有用于表示这三种情况的常量。它们是POSITIVE_INFINITY、NEGATIVE_INFINITY和NaN。
另外,请考虑以下内容:
double a = Math.pow(10, 600) - Math.pow(10, 600); //==NaN
从数学上讲,每个人都可以看出它是0。但对于机器来说,它是一个“无穷大减去无穷大”(同等级),这实际上是NaN。
float
和double
不仅违反了字段公理 - 它们甚至不是等价类。这不仅仅是数学家感兴趣的问题,因为它强制使用丑陋的修补程序使集合工作。 - supercatInfinity(在Java中)意味着操作的结果将是一个极其大的正数或负数,无法正常表示。
这个概念是用来表示可以从“普通”数字运算自然产生的特殊数字。您可以将无穷大(正负)视为浮点表示的“溢出”,其想法是在至少某些条件下,函数返回此类值仍然会给出有意义的结果。它们仍具有某些排序属性,例如(因此它们不会破坏排序操作,例如)。
Nan非常特殊:如果x是Nan,则x == x为false(这实际上是一种测试nan的方法,至少在C中)。如果您不习惯浮点奇特性,这可能会相当困惑。除非进行科学计算,否则我会说通过操作返回Nan是一个错误,至少在我能想到的大多数情况下。Nan可能来自各种操作:0/0,inf-inf,inf/inf,0 * inf。 Nan也没有任何排序属性。
您可以像使用其他数字一样使用它们:
e.g:
float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
double a = Math.pow(10,600) - Math.pow(10,600); //==NaN
从数学上讲,每个人都可以看到它是0。但对于机器来说,它是一个“无穷大” - “无穷大”(同阶)的结果,实际上是NaN...