浮動小数点演算のキャンセルに問題があります。問題がどこにあるのかはわかっていますが、効率的な解決策が思いつきません。
ここに私の問題があります: 私は 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 とは異なるセル ID が返されることです。
では、この問題を解決する方法を知っている人はいますか? 明確に記載されていることを願っています