这三个特殊的浮点值意味着什么:正无穷大,负无穷大,NaN?

时间:2009-06-17 14:58:13

标签: java floating-point nan infinity

我们如何在我们的代码中使用它们,以及什么会导致NaN(不是数字)?

6 个答案:

答案 0 :(得分:15)

  • 正无穷大意味着向正方向转向无穷大 - 进入正向大小越来越大的值。
  • 负无穷大意味着向负方向转向无穷大 - 进入负向大小越来越大的值。
  • Not-a-number(NaN)是未定义的内容,例如0/0的结果。

Float类规范中的常量:

更多信息可在IEEE-754 page in Wikipedia

中找到

这是一个用来说明三个常数的小程序:

System.out.println(0f / 0f);
System.out.println(1f / 0f);
System.out.println(-1f / 0f);

输出:

NaN
Infinity
-Infinity

答案 1 :(得分:11)

如果您想了解有关Java中浮点数的更多信息,

This可能是一个很好的参考。

正无穷大是一个非常大的正数,无法正常表示。负无穷大是一个负数,它无法正常表示。 NaN表示“非数字”,并且是由数学运算产生的,该数学运算不产生数字,如0除以0。

在Java中,Double和Float类都有常量来表示所有三种情况。它们是POSITIVE_INFINITY,NEGATIVE_INFINITY和NaN。

另外考虑一下:

double a = Math.pow(10, 600) - Math.pow(10, 600); //==NaN

数学上,每个人都可以看到它是0.但是对于机器来说,它是一个“无限” - “无限”(相同等级),它确实是NaN。

答案 2 :(得分:3)

  • 1/0将导致正无穷大。
  • 0/0将导致Nan。您可以使用NaN作为任何其他数字,例如:NaN + NaN = NaN,NaN + 2.0 = NaN
  • -1/0将导致负无穷大。

Infinity(在java中)意味着操作的结果将是一个非常大的正数或负数,它无法正常表示。

答案 3 :(得分:2)

这个想法是代表特殊数字,这些特殊数字可以通过对“正常”数字的操作自然产生。你可以看到无限(正面和负面)作为浮点表示的“溢出”,这个想法是,至少在某些条件下,具有函数返回的这样的值仍然会给出有意义的结果。例如,它们仍然具有一些排序属性(因此它们不会拧紧排序操作)。

Nan非常特别:如果x是Nan,则x == x是假的(这实际上是测试nan的一种方法,至少在C中,再次)。如果您不习惯浮点特性,这可能会非常混乱。除非你进行科学计算,否则我会说通过操作返回Nan是一个错误,至少在大多数情况下会浮现在脑海中。 Nan可以进行各种操作:0/0,inf - inf,inf / inf,0 * inf。 Nan也没有任何订购财产。

答案 4 :(得分:0)

您可以将它们用作任何其他数字:

e.g:

float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;

答案 5 :(得分:0)

  

正无穷大是一个非常大的正数,它不可能   通常代表。负无穷大是一个如此大的负数   它无法正常表示。 NaN表示"不是数字"和   来自数学运算的结果,该运算不会产生数字 -   比如将0除以0。

这不是一个完整的答案(或者说不够清楚) - 考虑一下:

double a = Math.pow(10,600) - Math.pow(10,600); //==NaN

数学上每个人都可以看到它是0.但对于机器来说它是一个" Infinity" - " Infinity"(同样的顺序)女巫确实是NaN ......