这三个特殊浮点值的含义是什么:正无穷大、负无穷大、NaN?
-
06-07-2019 - |
题
我们如何在代码中使用它们,什么会导致 NaN(不是数字)?
解决方案
如果您想了解有关浮动的更多信息,这可能是一个很好的参考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。
其他提示
- 正无穷大意味着在正方向上趋向无穷大——在正方向上数值越来越大。
- 负无穷大意味着在负方向上趋向无穷大——在负方向上进入幅度越来越大的值。
- 非数字 (NaN) 是未定义的东西,例如
0/0
.
以及规范中的常数 Float
班级:
更多信息可以在 维基百科中的 IEEE-754 页面.
这是一个小程序来说明这三个常量:
System.out.println(0f / 0f);
System.out.println(1f / 0f);
System.out.println(-1f / 0f);
输出:
NaN
Infinity
-Infinity
- 1/0 将导致正无穷大。
- 0/0 将导致 Nan。您可以将 NaN 用作任何其他数字,例如:NaN+NaN=NaN, NaN+2.0=NaN
- -1/0 将导致负无穷大。
无穷大(在java中)意味着运算的结果将是一个非常大的正数或负数,以至于无法正常表示。
这个想法是代表特殊的数字,这些数字可以自然地从“正常”的操作中产生。数字。你可以看到无限(正面和负面)为“溢出”。浮点表示的思想是,在至少某些条件下,具有由函数返回的这样的值仍然给出有意义的结果。例如,它们仍然具有一些排序属性(因此它们不会拧紧排序操作)。
Nan非常特别:如果x是Nan,则x == x是假的(这实际上是测试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;
正无穷大是一个非常大的正数,它不可能 通常代表。负无穷大是一个如此大的负数 它无法正常表示。 NaN表示“非数字”。和 来自数学运算的结果不会产生数字 - 比如将0除以0。
这不是一个完整的答案(或者说不够清楚) - 考虑一下:
double a = Math.pow(10,600) - Math.pow(10,600); //==NaN
数学上每个人都可以看到它是0.但对于机器来说它是一个“无限”。 - “无限”(同一顺序)女巫确实是NaN ......