浮点决定论 - Java做出错误的输出,C++正确的
Floating point determinism - Java makes wrong output, C++ correct
>我面临着一个巨大的问题,我不知道是什么原因造成的以及如何解决这个问题。我正在创建一个用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 中解决这个问题?
这与舍入误差有关,尽管我不确定它们为什么会出现。要修复它,您可以使用
正确答案=数学轮(答案);
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- 如何根据单词在文本中出现的概率输出单词