我在浮点运算中确实存在取消问题。我知道问题出在哪里,但我想不出一个有效的解决方案。
这是我的问题:我有一个 3D 粒子模拟,所以每个粒子都有 3 个坐标(x,y,z)。整个域被分成子单元。在某一时刻,我计算了粒子在某个时间步长所在的子单元格的 ID。这是一个简单的公式:
int cellOffset_y = (pos[1] - y_min) / cellWidth_y;
pos[1] 是粒子的 x 坐标,y_min 是域的开始,cellWidth 是单元格的宽度。
这是我的问题:我有一个测试用例,在这种情况下粒子的坐标应该是 0。由于浮点不准确,它大约是。-3e-18。当我使用这个公式时,-3e-18 由于取消而下降。现在最大的问题是,由于粒子位置为负,并且边界正好在 0,我得到的 cellID 与粒子实际所在的 cellID 不同。
那么有人知道如何解决这个问题吗?我希望它说清楚