浮点决定论 - Java做出错误的输出,C++正确的

Floating point determinism - Java makes wrong output, C++ correct

本文关键字:输出 C++ 错误 出错 决定论 Java      更新时间:2023-10-16

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

插值算法如下所示:

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

上述所有值都是浮点数(alpha、当前、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.

但在爪哇中 - 它没有。对于 80.000 个案例,有 ~400-500 个情况,其中draw.x(来自我们函数的返回值)变为 99.99999999999。

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

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

这与舍入误差有关,尽管我不确定它们为什么会出现。要修复它,您可以使用

正确答案=数学轮(答案);