gpt4 book ai didi

java - 避免算法中的浮点精度误差

转载 作者:行者123 更新时间:2023-12-01 18:35:36 25 4
gpt4 key购买 nike

在我的 2D 物理模拟 (Java) 中,我按如下方式计算凸多边形的中心,其中参数 area 是之前计算的多边形的封闭面积。

private Vector2d calculateCenterOfMass(double area) {
Vector2d center = new Vector2d(0, 0);

for (int i = 0; i < vertices.length; i++) {
int j = (i + 1) % vertices.length;
double factor = (vertices[i].x * vertices[j].y
- vertices[j].x * vertices[i].y);
center.x += (vertices[i].x + vertices[j].x) * factor;
center.y += (vertices[i].y + vertices[j].y) * factor;
}
center.scale(1 / (area * 6));

return center;
}

我还有一个具有以下点的多边形,我使用该函数来计算其质心:

Vector2d [x=325.20399446366355, y=400.0, length=515.5168649182318]
Vector2d [x=375.20399446366355, y=400.0, length=548.4323453822622]
Vector2d [x=375.20399446366355, y=450.0, length=585.8993407245727]
Vector2d [x=325.20399446366355, y=450.0, length=555.2095442399406]

只需查看 y 值即可看出,中心必须位于 y=425.0。由于浮点魔法,y 值变为 425.00000000000017。作为参数给出的面积具有精确值2500.0

如何避免这种情况并获得预期的 425.0?

最佳答案

BigDecimal 可以提供帮助,但我建议阅读整个答案。

从某种意义上说,浮点错误是“正常”的,因为您无法在变量中精确存储每个 float 。有很多资源如何处理这个问题,这里有一些链接:

  1. 如果您不知道实际问题是什么,请检查 this出来。
  2. What Every Computer Scientist Should Know About Floating-Poit Arithmetic
  3. IEEE floating point
  4. 为您提供工作思路:Quantity Pattern

关于java - 避免算法中的浮点精度误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22167737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com