对 double 数据类型的大量操作结果为零

Large number of operations on double data type producing zero as result

我有一个程序可以将概率乘以 500 多倍,但是当我这样做时输出为零。我应该使用其他数据类型吗? 请帮忙。 这是我使用的代码:

double d = 1/80000d;
    for (int i = 0; i < 500; i++) {
        d *= d;
    }
    System.out.println(d);

输出为零,因为double的精度有限,如果你将一个小于1的数乘以它本身足够多的次数,你得到的结果会太小而无法与0区分开来。

如果你在每次迭代后打印 d,你会发现它很快变成 0 :

1.5625E-10
2.4414062500000002E-20
5.960464477539064E-40
3.552713678800502E-79
1.2621774483536196E-157
1.593091911E-314
0.0

自然地,如果你有两个小于 1 的数字,并且重复乘法的次数迟早会足够小,以至于无法在 Double、Extended 或它以后做的任何浮点运算中重新表示。 ;)

轮到你的是已经存储在类型中的近似值。 ZERO 是 IEEE 754 格式的特殊常量之一。

我不知道JAVA,但在其他语言中存在扩展类型。

在处理概率时,您可以通过使用对数来避免此类数值问题,这样您就可以进行加法运算。像

double d = 1/80000d;
double ld = Math.log(d)
for (int i = 0; i < 500; i++) {
    ld += ld;
}
System.out.println(ld);