Java中整形运算是不允许0做为分母的(其他语言可能可以),但是在【浮点运算!!!】中是可以的,于是出现了infinity与NAN
NAN与无限是数值的一种类型
infinity无限
产生:
分子不为零分母为零,做除法的时候产生,表示无穷大或无穷小的数【浮点数运算】
即浮点数超出取值范围,不会抛出错误,用INFINITY进行表示,仍能正常地进行比较,在编程的一些时候很方便
注意:
无限乘以0得到的值为NAN,即非数字
除了乘以0外,对无限值做运算所得的值还是无限(片面的。有0,与无限没有考虑进去)
NAN not a number不是一个数
产生:
1. NAN参与的运算结果就是NAN
1. 至少有一个参数是NaN的运算
2.不定式
2.1 下列除法运算:0.0/0、∞/∞、∞/?∞、?∞/∞、?∞/?∞ 分子分母都为零,做除法时出现的非法类型【浮点数运算】
2.2 下列乘法运算:0×∞、0×?∞
2.3 下列加法运算:∞ + (?∞)、(?∞) + ∞
2.4 下列减法运算:∞ - ∞、(?∞) - (?∞)
3.产生复数结果的实数运算。例如:
3.1 对负数进行开偶次方的运算
3.2 对负数进行对数运算
3.3 对正弦或余弦到达域以外的数进行反正弦或反余弦运算
注意:
1 NaN不和任何东西相等,甚至是它自己本身
2 NaN转成Long统一被jvm虚拟机翻译为0xff800001
3 Double a = new Double(Double.NaN);
Double b = new Double(Double.NaN);]
a.equals(b); //true
理解:NAN作为一个数值型,可能有自己的一个单独的地址单元
任何用其创建的对象的地址都是相同的
4 float nan=Float.NaN;
float anotherNan=Float.NaN;
System.out.println(Float.compare(nan,anotherNan));
compare()方法如果返回0,就说明两个数相等,返回-1,就说明第一个比第二个小,返回1则正好相反。
上面语句的返回结果是0。
一般来说,基本类型的compare()方法与直接使用==的效果“应该”是一样的,但在NaN这个问题上不一致,
是利是弊,取决于使用的人作何期望。当程序的语义要求两个NaN不应该被认为相等时
(例如用NaN来代表两个无穷大,学过高等数学的朋友们都记得,两个无穷看上去符号是一样,但不应该认为是相等的两样东西),
就使用==判断;如果NaN被看得无足轻重(毕竟,我只关心数字,两个不是数字的东西就划归同一类好了嘛)
就使用Float.compare()。
5 另一个在==和compare()方法上表现不一致的浮点数就是正0和负0(当然这也是计算机表示有符号数字的老大难问题),
我们(万能的)人类当然知道0.0f和-0.0f应该是相等的数字,但是试试下面的代码:
float negZero=-0.0f;
float zero=0.0f;
System.out.println(zero==negZero);
System.out.println(Float.compare(zero,negZero));
返回的结果是true和-1。看到了么,==认为正0和负0相等,而compare()方法认为正0比负0要大。
所以对0的比较来说,==是更好的选择。
判断:
目前可采用包装数据类型(Integer、Float、Double等)中的isInfinity()/isNaN()方法判断值是否为infinity/NaN
【总结】
0.0/0的浮点数运算为 NAN
非0/0的浮点数运算为 无穷 -infinity/infinity
NAN参与的运算都为NAN
无限-无限=NAN
无限/无限=NAN
无限+有限数==无限
Infinity与-Infinity参与的运算,即
Infinity + Infinity = Infinity,
Infinity-Infinity = NaN
Infinity*Infinity=Infinity,
Infinity / Infinity = NaN
-Infinity + -Infinity = -Infinity,
-Infinity - -Infinity = NaN,
-Infinity * -Infinity = Infinity,
-Infinity / -Infinity = NaN
Infinity / 0 = Infinity,
-Infinity / 0 = -Infinity
Infinity / 1.0 = Infinity,
Infinity / -1.0 = -Infinity,
-Infinity / 1.0 = -Infinity,
-Infinity / -1.0 = Infinity
有限数与Infinity、-Infinity的运算:
1.0 / Infinity = 0.0,
-1.0 / Infinity = 0.0,
1.0 / -Infinity = -0.0,
-1.0/Infinity = -0.0
零与Infinity、-Infinity的运算:
0 / Infinity = 0.0,
0 / -Infinity = -0.0