infinity与NAN参与运算的机制

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值