上文:Java虚拟机规范.Java SE 8版中关于浮点类型的说明,Infinity和-Infinity
给大家提到一个小的知识点,即浮点数的0,它有正负之分
作为分母不会产生java.lang.ArithmeticException: / by zero
,而是得到正负无穷大,
说明
至于为什么,这是IEEE 754标准定义的,→标准传送门
在《Java虚拟机规范.Java SE 8版》第二章第三节有如下描述
那我就好奇了,你说正无穷+负无穷应该等于多少,会是零吗?
代码
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中唯一一个“我”不是“我”的“数据”,狠起来不止是六亲不认,连自己都不认
在书中是这样描述的
总结:
- 浮点类型中,负零等于正零
- 1除以正零得到正无穷大 1除以负零得到负无穷小
- 正无穷大+负无穷小 = NaN,意思是不允许这么操作
- NaN和任何数比较都返回false,包括自己;不仅六亲不认,自己也不认
别问为什么,问就去看IEEE 754标准→标准传送门