双数据类型上的大量操作因此产生零

时间:2015-03-07 04:47:32

标签: java floating-point double

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

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

3 个答案:

答案 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,但存在其他语言的扩展类型。