对数和舍入不一致

时间:2016-10-07 11:40:26

标签: java double rounding logarithm significance

最近在开发计算器以简化游戏(reactoridle)时,我遇到了一个持续存在的问题。问题是,当GUI中的输入数字被更改为某些边界之间的数字时,它会在按Enter键时立即回复到它下方的数字,有时如果再次按下Enter键,它甚至会重复。

我认为代码的一部分在某种程度上与另一部分不一致,即使背后的数学是稳固的。

第一段代码计算热室产生的热量,第二段重新计算每个组件处理热量所需的升级。 所以说你现在正在进行的升级是在代码工作和冲突的边界,如果然后增加升级,它将立即快速恢复。当第一段代码计算出热量时,第二段代码决定你可以用少一点升级来实现热量。

相关的代码位是:

double insulationMultiplier = 1 + insulationPerCell * (insulationUpgrades + 1) * INSULATION_HEAT_MODIFIER;
            double upgradeMultiplier = Math.pow(Cell.HEAT_MULTIPLIER, cellUpgrades);
            this.heat = cells * insulationMultiplier * upgradeMultiplier * cell.heat * (1 + 0x4p-50d); //???
                                                                                        //avoid trouble when calculating cellUpgrades

            this.calculate(START_FROM_HEAT);


double insulationMultiplier = 1 + insulationPerCell * (insulationUpgrades + 1) * INSULATION_HEAT_MODIFIER; 
            double circulatorMultiplier = circulators ? CIRCULATOR_HEAT_MODIFIER * Math.pow(CIRCULATOR_HEAT_MULTIPLIER, circulatorUpgrades) : 1;

            cellUpgrades = (int) ((Math.log(this.heat) - Math.log(insulationMultiplier * cells * cell.heat)) / Math.log(Cell.HEAT_MULTIPLIER));

正如您所看到的,我通过将第一部分中计算出的热量乘以1 + 0x4p-50d来解决问题,这样可以将热量调整到足以防止算法的第二部分舍入升级再次下降,尽可能小,以避免显示出不同的热值。

同样的问题出现在并行的代码中,与其他两个组件相关,但是规模要大得多,因此它会一次跳过多个数字。我宁愿不像我为第一个组件那样解决它,因为这可能会反过来与其他事情发生冲突。

是否有更严格的方式可以解决这个问题?

提前致谢。

0 个答案:

没有答案