Infinity和NaN

蔚落 2022-08-02 12:56 283阅读 0赞

今天,偶然发现当double类型的数除以0的时候编译器竟然没有报错,运行结果为Infinity。

  1. public static void main(String[] args) {
  2. double a=5;
  3. System.out.println(a/0);
  4. }

结果为:

Infinity

我自己有点纳闷,因为这是我第一次遇到Infinity,差了一下才知道,它的意思就是无穷大。

我联想到Java中的另一个特殊的值NaN,我试着改变a的值,看是否能出现NaN。终于当我将a的值改变为0时,输出结果为NaN,即 0/0=NaN。

我又上网查了一下,发现了一些有趣的现象。

无穷大加1还是无穷大。

Java可以让一个float或double类型的值来表示无穷大。正如我们所知道的“无穷大加上一还是无穷大”。

  1. double a = 1.0/0.0;

a的值为Infinity,即无穷大,也可以用标准类库中的常量表示:

  1. floata=Float.POSITIVE_INFINITY;

  1. doublea=Double.POSITIVE_INFINITY;

查看以下代码:

  1. publicstatic void main(String[] args) {
  2. floata=Float.POSITIVE_INFINITY;
  3. if(a+1==a)
  4. System.out.println(a);
  5. }

运行结果为:Infinity

a+1是等于a的即无穷大加1还是无穷大。

NaN不等于任何浮点数值,包括它自己。

浮点算术保留了一个特殊的值用来表示一个不是数字的数量即NaN。对于所有没有良好的数字定义的浮点计算,例如0.0/0.0,其值都是它。

  1. double a = 0.0/0.0;

a的值为NaN,即a不是数字,也可以用标准类库中的常量表示:

  1. floata=Float.NaN;

  1. doublea=Double.NaN;

查看以下代码:

  1. publicstatic void main(String[] args) {
  2. floata=Float.NaN;
  3. if(a!=a)
  4. System.out.println(a);
  5. }

输出结果为:NaN

NaN不等于任何浮点数的值包括它自己。

任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。

查看以下代码:

  1. publicstatic void main(String[] args) {
  2. floata=Float.NaN;
  3. System.out.println(a+10);
  4. }

输出结果为:NaN

NaN与任何数进行运算,结果均为NaN。

NaN与任何数做“==”比较,结果均为false。

查看以下代码:

  1. publicstatic void main(String[] args) {
  2. floata=Float.NaN;
  3. if(a==0) {
  4. System.out.println("NaN=0");
  5. }else{
  6. System.out.println("NaN!=0");
  7. }
  8. }

输出结果为:NaN!=0

Double.NaN == Double.NaN;结果为false

Float.compare()和Double.compare()

当我们使用Float.compare()或Double.compare()比较两个NaN时,会得到相等的结果。

  1. publicstatic void main(String[] args) {
  2. floata=Float.NaN;
  3. floatb=Float.NaN;
  4. System.out.println(Float.compare(a,b));
  5. }

输出结果为:0

compare()方法如果返回0,就说明两个数相等,返回-1,就说明第一个比第二个小,返回1则正好相反。

一般来说,基本类型的compare()方法与直接使用==的效果“应该”是一样的,但在NaN这个问题上不一致。

还有:

  1. publicstatic void main(String[] args) {
  2. floatnegZero=-0.0f;
  3. floatzero=0.0f;
  4. System.out.println(zero==negZero);
  5. System.out.println(Float.compare(zero,negZero));
  6. }

结果为:

true

1

即==认为正0和负0相等,而compare()方法认为正0比负0要大。

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 InfinityNaN

    今天,偶然发现当double类型的数除以0的时候编译器竟然没有报错,运行结果为Infinity。 public static void main(String[] a

    相关 java中的NANINFINITY

    java浮点数运算中有两个特殊的情况:NAN、INFINITY。 1、INFINITY: 在浮点数运算时,有时我们会遇到除数为0的情况,那java是如何解决的呢? 我们知