即使这些数字不是无穷大,两个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
答案 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