0
点赞
收藏
分享

微信扫一扫

java中的“我”不是“我”,NaN特殊标识以及正无穷+负无穷应该等于多少?

上文:Java虚拟机规范.Java SE 8版中关于浮点类型的说明,Infinity和-Infinity

给大家提到一个小的知识点,即浮点数的0,它有正负之分

作为分母不会产生​​java.lang.ArithmeticException: / by zero​​,而是得到正负无穷大,

说明

至于为什么,这是IEEE 754标准定义的,→​​标准传送门​​

在《Java虚拟机规范.Java SE 8版》第二章第三节有如下描述

java中的“我”不是“我”,NaN特殊标识以及正无穷+负无穷应该等于多少?_java虚拟机

那我就好奇了,你说正无穷+负无穷应该等于多少,会是零吗?

代码

public static void main(String[] args) {

float f1 = 1f;
float f2 = 0.0f;
float f3 = -0.0f;

float res = (f1/f3+f1/f2);

System.out.println(" f2 == f3 is "+(f2==f3));// true

System.out.println(" f1 / f2 = "+f1/f2);// Infinity 无穷大

System.out.println(" f1 / f3 = "+f1/f3);// -Infinity 负无穷小

/**
* 负无穷+正无穷 = NaN (即无效的运算操作)
*/
System.out.println("(f1 / f3)+(f1 / f2) = "+ res);// NaN

/**
* ”我“不是”我“
*/
System.out.println(" res == res is "+(res==res));// false

}

实验结果表明,java 虚拟机认为我太无聊了,懒得搭理我,直接返回了个​​NaN​

​NaN​​​的全称是Not-a-Number,它是IEEE标准定义的一个特殊的“非数字”标识,用来表示某些无效的运算操作,例如0除0等情况,→​​标准传送门​​

java中的“我”不是“我”,NaN特殊标识以及正无穷+负无穷应该等于多少?_java虚拟机_02

而且它还是java中唯一一个“我”不是“我”的“数据”,狠起来不止是六亲不认,连自己都不认

在书中是这样描述的
java中的“我”不是“我”,NaN特殊标识以及正无穷+负无穷应该等于多少?_java_03

总结:

  • 浮点类型中,负零等于正零
  • 1除以正零得到正无穷大 1除以负零得到负无穷小
  • 正无穷大+负无穷小 = NaN,意思是不允许这么操作
  • NaN和任何数比较都返回false,包括自己;不仅六亲不认,自己也不认

别问为什么,问就去看IEEE 754标准→​​标准传送门​​


举报

相关推荐

0 条评论