Java 添加几个小浮点值会溢出到无穷大

Java 添加几个小浮点值会溢出到无穷大,java,infinity,Java,Infinity,我遇到了一个循环的问题,这个循环应该将一些非常小的浮点值相加,最终生成一个加权平均值,如下所示: for(int k = 0; k < slopes.size(); k++){ if(slopes.get(k).isClimbing() == false){ float tempWeight = (slopes.get(k).getzDiff() / highestFallZ); weight += tempWeigh

我遇到了一个循环的问题,这个循环应该将一些非常小的浮点值相加,最终生成一个加权平均值,如下所示:

    for(int k = 0; k < slopes.size(); k++){
        if(slopes.get(k).isClimbing() == false){
            float tempWeight = (slopes.get(k).getzDiff() / highestFallZ);
            weight += tempWeight;
            highestFallX += (slopes.get(k).getEndX() * tempWeight);
        }

        highestFallX = highestFallX / weight;
    }

从那以后,它一直呈指数增长,并且在大约10个循环内达到无穷大。在循环过程中,highestFallX变量不会被任何其他变量引用或修改。

它必须有多精确?您可以简单地将所有内容都放到第三个小数点之后,以确保它不会遇到大量数字的问题

表示平均值的一种方法是:

totalValue += nextValue * nextWeight;
totalWeight += nextWeight;
average = totalValue / totalWeight;
正如您所看到的,
totalValue
中容易出现溢出

相反,您还可以执行以下操作:

totalWeight += nextWeight;
average += ((nextValue * nextWeight) - average) / totalWeight;
在你的情况下,我认为这可能看起来像:

for(int k = 0; k < slopes.size(); k++){
    if(slopes.get(k).isClimbing() == false){
        float tempWeight = (slopes.get(k).getzDiff() / highestFallZ);
        weight += tempWeight;
        float weightedValue = (slopes.get(k).getEndX() * tempWeight);
        float delta = weightedValue - highestFallX;
        highestFallX += delta / weight;
    }
}
for(int k=0;k

但我仍在努力准确计算加权平均值的工作方式,因此我对最后一点有点不确定。

尝试了您的方法后,我意识到我在循环的每次运行中都是按组合权重进行除法,而不是在理货正确汇总后只进行一次除法。所有的一切都是因为一个错位的}干杯!
for(int k = 0; k < slopes.size(); k++){
    if(slopes.get(k).isClimbing() == false){
        float tempWeight = (slopes.get(k).getzDiff() / highestFallZ);
        weight += tempWeight;
        float weightedValue = (slopes.get(k).getEndX() * tempWeight);
        float delta = weightedValue - highestFallX;
        highestFallX += delta / weight;
    }
}