浮点确定性 - Java输出错误,C ++正确

时间:2016-06-20 19:08:05

标签: java c++ floating-point interpolation precision

我面临一个巨大的问题,我不知道导致它的原因以及如何解决这个问题。我正在创建一个用Java绘制对象的游戏。对于绘图,我使用线性插值,使用' alpha'用于在一帧中移动具有特定时间值的对象的值。

以下是插值算法的样子:

draw.x = current.getX() * alpha + previous.getX() * (1.0f - alpha);

以上所有值都是浮点数(alpha,current,prev和draw)。

我们假设我们没有移动,current.getX()previous.getX()都是100.0f浮动。

Alpha值是随机的(它不是随机的,但它是0.0 - 1.0范围内的数字) - 也是浮点数。

让我们来alpha = 0,4352343

draw.x = 100.f * 0.4352343 + 100.f * (1.0f - 0.4352343) == 43,52343 + 56,47657 == 100

这是完美的,因为我们不会移动 - 它应该是100(我们之前和当前的位置都是100)。

这就是数学的工作原理,无论alpha有什么价值 - 它总会返回100,对吗?

否<!/强>

在C ++中确实如此 - 它完美运行,我测试了30分钟,输出为1000万个案例 - 它总是返回100.0

但在Java中 - 它没有。对于80.000例,有大约400-500例draw.x(函数的返回值)变为99.99999999999。

当我画画时,这是完全不可接受的原因,我需要使用int,所以我必须施放,所以它给出99值,你可以猜出动画会发生什么。

我只有一个问题 - 这怎么可能,上面的算法可以在Java和C ++中给出不同的值以及如何在Java中解决这个问题?

1 个答案:

答案 0 :(得分:-1)

它与舍入误差有关,虽然我不确定它们为什么会出现。要解决此问题,您可以使用

正确答案= Math.round(回答);