对 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);
我有一个程序可以将概率乘以 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);