Java 双值变为零

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

我在mapreduce hadoop中实现HMM,但在双重下溢之后,bwd的以下部分值变为零

    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