12

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

4

6 回答 6

16
  • 正无穷意味着在​​正方向上趋于无穷——在正方向上进入越来越大的值。
  • 负无穷意味着在​​负方向上趋于无穷——在负方向上进入越来越大的值。
  • 非数字(NaN) 是未定义的东西,例如0/0.

以及来自类规范的常量Float

更多信息可以在 Wikipedia 的 IEEE-754 页面中找到。

下面是一个小程序来说明这三个常量:

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

输出:

NaN
Infinity
-Infinity
于 2009-06-17T15:01:30.303 回答
13

如果您想了解有关 Java 中浮点数的更多信息,这可能是一个很好的参考。

正无穷大是一个大到无法正常表示的正数。负无穷大是一个大到无法正常表示的负数。NaN 的意思是“不是数字”,它是由不会产生数字的数学运算产生的——比如将 0 除以 0。

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

另外考虑一下:

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

在数学上,大家可以看到它是0。但是对于机器来说,它是一个“Infinity” - “Infinity”(同秩),它确实是NaN。

于 2009-06-17T15:08:19.587 回答
3
  • 1/0 将导致正无穷大。
  • 0/0 将导致 Nan。您可以将 NaN 用作任何其他数字,例如:NaN+NaN=NaN, NaN+2.0=NaN
  • -1/0 将导致负无穷大。

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

于 2009-06-17T15:06:13.833 回答
2

这个想法是表示可以从对“正常”数字的操作中自然产生的特殊数字。您可以将无穷大(正数和负数)视为浮点表示的“溢出”,其想法是至少在某些情况下,函数返回这样的值仍然会产生有意义的结果。例如,它们仍然具有一些排序属性(例如,它们不会进行排序操作)。

Nan 非常特别:如果 x 是 Nan,则 x == x 为假(这实际上是测试 nan 的一种方法,至少在 C 中是这样)。如果您不习惯浮点特性,这可能会非常令人困惑。除非您进行科学计算,否则我会说通过操作返回 Nan 是一个错误,至少在大多数情况下是这样。Nan可以进行各种操作:0/0、inf - inf、inf/inf、0*inf。Nan 也没有任何有序属性。

于 2009-06-17T15:10:17.430 回答
0

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

例如:

float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
于 2009-06-17T15:11:29.610 回答
0

正无穷大是一个大到无法正常表示的正数。负无穷大是一个大到无法正常表示的负数。NaN 的意思是“不是数字”,它是由不产生数字的数学运算产生的——比如将 0 除以 0。

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

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

从数学上讲,每个人都可以看到它是 0。但对于机器来说,它是一个“无穷大”——“无穷大”(同阶)女巫确实是 NaN ......

于 2016-03-30T00:11:17.347 回答