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

时间:2013-12-27 15:16:44

标签: java sum double 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;
    }`

结果是:

Prob:1.0476603084695572E305
base 10: 702.3350127634005
base 2: 0.6931471805599453
result: 1.0615472972511642E308
entropy before sum: 1.246498306457423E308

那怎么可能是

的总和

result + entropy = 1.0615472972511642E308 + 1.246498306457423E308 = INFINITY

2 个答案:

答案 0 :(得分:9)

您的号码太大,无法容纳double 请考虑改为使用BigDecimal

答案 1 :(得分:0)

使用BigDecimal而不是Double因为BigDecimal包含任意精度整数未缩放值& 32-bit整数刻度。如果为零或正数,则比例是小数点右侧的位数。如果是负数,则将数字的未缩放值乘以10来表示比例的否定。因此,BigDecimal表示的数字的值为(unscaledValue × 10-scale)

了解详情:http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html