Float中的那些常量 Infinity、NaN

96
545a3c856c5f
2017.03.28 16:59* 字数 771

在 Java 计算中,肯定会使用各种基本数据类型,进行加减乘除等操作。但是假如哪一天,你发现一个函数给你返回了一个float结果,你打印出来后却发现不是小数,而是InfinityNaN这种东西,你可能就一脸黑人问号了。
这两个值确实是 Java 提供的数值,一个返回float的函数给你返回这两个值也是没有任何问题的。那这两个值各代表什么意义呢,下面给出答案:

无穷大 Infinity

Float类中,有两个静态常量:

public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

这两个常量一个表示正无穷,一个表示负无穷。在计算上,有一点一定要特别注意:

无穷大加上一个数还是无穷大

double infinity = 1.0 / 0;                  
System.out.println(infinity);             //Infinity  
System.out.println(infinity + 1);         //Infinity  
System.out.println(infinity == i + 1);    //true  

如果你要初始化一个数为无穷大,那么可以用任何被计算为无穷大的浮点算术表达式来初始化,或者使用Float提供的常量:

float infinity = 1.0 / 0.0;
float infinity  = Float.POSITIVE_INFINITY;

不是数字的数 NaN

NaN,not a number,对于所有没有良好的数字定义的浮点计算,如0.0/0.0,结果都是NaN。在Float类中,提供了一个常量来表示NaN:

public static final float NaN = 0.0f / 0.0f;

初始化一个数字为NaN,可以像Float一样用任何计算结果为NaN 的浮点算术表达式或直接用Float提供的这个常量:

float nan= 0.0 / 0.0;
float nan  = Float.NaN ;

NaN 有一些奇葩的性质,在计算时需要特别注意:

  1. NaN 不等于任何浮点数值,包括它自身在内;即它与任何数比较均返回false。
  1. 任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。

虽然NaN与任何数比较均返回false,但是使用Float.compare()这个方法来比较两个NaN时,却会得到相等的结果。如下:

float nan = 0.0 / 0;  
System.out.println(nan);             //NaN  
System.out.println(nan + 1);         //NaN  
System.out.println(nan == nan + 1);    //false  
float anan = 0.0 / 0;
System.out.println(Float.compare(nan,anan));    //true

Float 中的其他常量:

上面介绍了Float类中的3个常量,这3个是需要特别注意的,其他Float还有其他的常量,只是不常用而已。下面就对Float中的常量做一下总结:

  1. float POSITIVE_INFINITY = 1.0f / 0.0f;正无穷大
  2. float NEGATIVE_INFINITY = -1.0f / 0.0f;负无穷大
  3. float NaN = 0.0f / 0.0f;表示不是一个数字
  4. float MAX_VALUE = 0x1.fffffeP+127f; float能表示的最大正值:3.4028235e+38f
  5. float MIN_NORMAL = 0x1.0p-126f; 1.17549435E-38f
  6. float MIN_VALUE = 0x0.000002P-126f; float能表示的最小正值 1.4e-45f
  7. final int MAX_EXPONENT = 127; 一个有限float数值的最大指数值
  8. final int MIN_EXPONENT = -126; 一个有限float数值的最小指数值
  9. final int SIZE = 32; 一个float类型数值占用的比特数
  10. final int BYTES = SIZE / Byte.SIZE; 一个float类型数值占用的字节数

另外,在 Java 提供的另一个浮点类Double类中,也存在相同意义的常量,只是值不同而已。

Android 探究杂记
Web note ad 1