Java 双值变为零
我在mapreduce hadoop中实现HMM,但在双重下溢之后,bwd的以下部分值变为零Java 双值变为零,java,mapreduce,double,precision,Java,Mapreduce,Double,Precision,我在mapreduce hadoop中实现HMM,但在双重下溢之后,bwd的以下部分值变为零 bwd = new double[numofstates][T]; /* initialization (time 0) */ for (int i = 0; i < numofstates; i++) bwd[i][T-1] = 1; /* i
bwd = new double[numofstates][T];
/* initialization (time 0) */
for (int i = 0; i < numofstates; i++)
bwd[i][T-1] = 1;
/* induction */
double dtemp ;
for (int t = T - 2; t >= 0; t--) {
for (int i = 0; i < numofstates; i++) {
bwd[i][t] = 0;
for (int j = 0; j < numofstates; j++){
dtemp = (bwd[j][t+1] * A[i][j] * B[j][o[t+1]]);
if(Double.compare(dtemp, 0.0) < 0)
{
//to check
context.write(new Text("t " + t) , new Text("negative"));
}
else
bwd[i][t] =bwd[i][t] + dtemp;
//to check
context.write(new Text("t "+t + " i "+i + "j "+j),new Text("temp" + dtemp + " " + bwd[i][t]));
}
}
}
现在t一直到21,之后bwd[0][20]也变为“零”,即使这是一个加法。我无法理解那里发生了什么。像
3.5E-323
这样的值非常接近于下溢到零。你知道为什么你要处理这么小的数字吗?是的,那是因为这个乘法(bwd[j][t+1]*A[i][j]*B[j][o[t+1]]),为了让代码工作,我用布尔变量修补了代码,然后给dwd[i][t]赋值,但我仍然不知道如何正确处理它。恐怕我不明白你的问题。当您进行四舍五入结果小于最小正双精度(约4.9E-324)的计算时,零是正常的标准结果。这是一个非常小的数字。是的,问题不是这个。问题是我对bwd[I][t]=bwd[I][t]+dtemp求和;它最初有一些值(参见样本输出中的t=108,它是5.0E-5),现在我进一步给它加上值,现在直到t=21,d[I][t]的值>0,突然变为0。你能构造一个能显示实际问题的,没有令人困惑的小数字吗?
t 108 i 3j 1 temp2.5E-5 5.0E-5
t 108 i 3j 3 temp2.5E-5 1.775E-4
.
.
t 20 i 3 j 2 temp 0.0 0.0
t 21 i 0j 0 temp4.9E-324 4.9E-324
t 21 i 0j 2 temp2.5E-323 3.5E-323