java中两个双数的总和是无穷大

use*_*367 5 java double sum infinity

即使这些数字不是无穷大,两个double的总和也是无穷大.代码如下.

entropy += (probs.get(key)* (Math.log(probs.get(key)) / Math.log(2.0)));
    if(entropy == Double.POSITIVE_INFINITY || entropy == Double.NEGATIVE_INFINITY){
        System.out.println("Prob:"+probs.get(key));
        System.out.println("base 10: "+Math.log(probs.get(key)));
        System.out.println("base 2: "+Math.log(2.0));
        System.out.println("result: "+(probs.get(key)*(Math.log(probs.get(key))) / Math.log(2.0)));
        System.out.println("entropy before sum "+temp);
        break;
    }`
Run Code Online (Sandbox Code Playgroud)

结果是:

Prob:1.0476603084695572E305
base 10: 702.3350127634005
base 2: 0.6931471805599453
result: 1.0615472972511642E308
entropy before sum: 1.246498306457423E308
Run Code Online (Sandbox Code Playgroud)

那怎么可能总和

result + entropy = 1.0615472972511642E308 + 1.246498306457423E308 = INFINITY

SLa*_*aks 10

你的号码太大了,不适合double.
考虑BigDecimal改用.

  • 通过[JLS](http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3),"溢出的浮点运算产生了一个符号无穷." (5认同)