java nan和infinity_Java中的NAN和INFINITY

在浮点数运算时,有时我们会遇到除数为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能够与数值类型进行比较。零减去正无穷能得到负无穷。

f414cc3aca6644ed396d906c6c767869.png

个人心得:即时浮点数超出取值范围, 不会抛出错误 ,用INFINITY进行表示,仍能正常地进行比较,在编程的一些时候很方便。

例如:string转数值型,如果是含有错误字符,便会抛出异常,如果是超过范围便会用“INFINITY”或者“-INFINITY”表示

9b9646f9a3802ebd41390b3d965c8a02.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值