Java中的NAN和INFINITY

发表于:2016-10-24 09:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Chay Cao    来源:51Testing软件测试网采编

  在浮点数运算时,有时我们会遇到除数为0的情况,那java是如何解决的呢?
  我们知道,在整型运算中,除数是不能为0的,否则直接运行错误。但是在浮点数运算中,引入了 无限 这个概念,我们来看一下Double和Float中的定义。
  Double:
  publicstaticfinaldoublePOSITIVE_INFINITY =1.0/0.0;
  publicstaticfinaldoubleNEGATIVE_INFINITY = -1.0/0.0;
  Float:
  publicstaticfinalfloatPOSITIVE_INFINITY =1.0f/0.0f;
  publicstaticfinalfloatNEGATIVE_INFINITY = -1.0f/0.0f;
  考虑下面几个问题:
  Float和Double中的无限有什么区别?
  例如无限乘以0会是什么?
  0除以0又会有什么结果?
  来看下面的示例
publicstaticvoidmain(String[] args){
floatfPos=Float.POSITIVE_INFINITY;
floatfNeg=Float.NEGATIVE_INFINITY;
doubledPos=Double.POSITIVE_INFINITY;
doubledNeg=Double.NEGATIVE_INFINITY;
//t1
System.out.println(fPos==dPos); //output: true
System.out.println(fNeg==dNeg); //output: true
//t2
System.out.println(fPos*0);//output: NAN
System.out.println(fNeg*0);//output: NAN
//t3
System.out.println(fPos==(fPos+10000));//output: true
System.out.println(fPos==(fPos*10000));//output: true
System.out.println(fPos==(fPos/0));//output: true
//t4
System.out.println(Double.isInfinite(dPos)); //output: true
}
  从上面几组测试中我们可得出一些结论:
  t1: Float中的无限和Double中的无限是相等的。
  t2: 无限乘以0得到的值为NAN,即非数字。
  t3: 除了乘以0外,对无限值做运算所得的值还是无限
  要判断一个浮点数是否为INFINITY,可用t4中所示的isInfinite方法。
  2、NAN:
  java中的NAN是这么定义的:
  publicstaticfinaldoubleNaN =0.0d /0.0;
  NAN表示非数字,它与任何值都不相等,甚至不等于它自己,所以要判断一个数是否为NAN要用isNAN方法:
  publicstaticvoidmain(String[] args){
  doublenan=Double.NaN;
  System.out.println(nan==nan); //output: false
  System.out.println(Double.isNaN(nan)); //output: true
  }
  3、NAN与INFINITY参与运算的情况
  零除以零=NaN,即0/0 = NaN
  非零数被零除的无穷值,即5.0 /0 = Infinity, -5.0/0 = -Infinity
  NaN参与的运算都为NaN,即
  NaN+NaN = NaN, NaN-NaN = NaN, NaN * NaN = NaN, NaN / NaN = NaN,
  NaN / 5.0 = NaN, NaN / Infinity = NaN, NaN / -Infinity = NaN,
  NaN + Infinity = NaN, NaN-Infinity=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 / 5.0 = Infinity, Infinity / -5.0 = -Infinity,
-Infinity / 5.0 = -Infinity, -Infinity / -5.0 = Infinity
  Infinity与-Infinity的加、减都分别为其自身.
  有限数与Infinity、-Infinity的运算:
  5.0 / Infinity = 0.0, -5.0 / Infinity = 0.0, 5.0 / -Infinity = -0.0, -5.0/Infinity = -0.0
  零与Infinity、-Infinity的运算:
  0 / Infinity = 0.0, 0 / -Infinity = -0.0
  4、INFINITY心得
  Java浮点型的取值范围:
  Float 32位单精度浮点数 10^-38 ~ 10^38 和 -10^-38 ~ -10^38
  Double 64位双精度浮点数 10^-308 ~ 10^308 和 -10^-308 ~ -10^308
  当浮点数超过取值范围的时候,会用INFINITY进行表示。并且INFINITY能够与数值类型进行比较。零减去正无穷能得到负无穷。
  个人心得:即时浮点数超出取值范围, 不会抛出错误 ,用INFINITY进行表示,仍能正常地进行比较,在编程的一些时候很方便。
  例如:string转数值型,如果是含有错误字符,便会抛出异常,如果是超过范围便会用“INFINITY”或者“-INFINITY”表示
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号