我有一个程序,它将概率乘以500倍,但是当我这样做时,输出为零。我应该使用其他一些数据类型吗? 请帮忙。 这是我正在使用的代码:
double d = 1/80000d;
for (int i = 0; i < 500; i++) {
d *= d;
}
System.out.println(d);
答案 0 :(得分:2)
输出为零,因为double
具有有限的优势,如果您将一个低于1的数字乘以足够的次数,您将得到的结果太小而无法与0区分。
如果您在每次迭代后打印d
,您会发现它变得非常快:
1.5625E-10
2.4414062500000002E-20
5.960464477539064E-40
3.552713678800502E-79
1.2621774483536196E-157
1.593091911E-314
0.0
答案 1 :(得分:1)
使用概率时,您可以通过使用对数来避免这些数值问题,这样您就可以进行加法运算。像
这样的东西double d = 1/80000d;
double ld = Math.log(d)
for (int i = 0; i < 500; i++) {
ld += ld;
}
System.out.println(ld);
答案 2 :(得分:0)
当然,如果你有两个小于1的数字,并且重复乘法次数迟早会小到不能在Double,Extended或将来完成的任何浮动算法中表示。 ;)
轮到您存储在该类型中的aproximation。 ZERO是IEEE 754格式的特殊常数之一。
我不认识JAVA,但存在其他语言的扩展类型。