我确实在浮点运算中取消了问题。我知道问题出在哪里,但我想不出有效的解决方案。
这是我的问题:我在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,我得到的粒子ID与粒子实际上的不同。
那么有人知道如何解决这个问题吗?我希望明确说明
答案 0 :(得分:2)
基本上有两种选择(好吧,三种,如果算上“活着问题”作为有效选择!):
将网格中的边框移动一小部分,以便允许某种程度的上游不准确。因此,对于(pos - y_min + k) / width
的一些小值,计算将变为k
。
当然,这并不能解决在另一个方向上发生的错误(即数字太大);事实上,这使情况变得更糟。但是没有解决这个问题的一般方法;你的代码不能“知道”-3e-18是正确还是只是略有错误!
修复上游计算。