-1

これは物理エンジンの一部です。
単純化された関数centerOfMassは、2 つの剛体の 1D 重心を計算します ( demo ) :-

#include <iostream>
#include <iomanip> 
float centerOfMass(float pos1,float m1, float pos2,float m2){
    return (pos1*m1+pos2*m2)/(m1+m2);
}
int main(){
    float a=5.55709743f;
    float b= centerOfMass(a,50,0,0);
    std::cout << std::setprecision(9) << a << '\n';  //5.55709743
    std::cout << std::setprecision(9) << b << '\n';  //5.55709696
}

私はb正確に= 5.55709743である必要があります。

わずかな違いが、場合によっては (私の実際のケース = 5%)、厄介な物理学の発散をもたらすことがあります。
これを解決するにはいくつかの方法があります。たとえば、いくつかの条件付きチェックを大幅に実行します。
ただし、それは私にとって非常にエラーが発生しやすいです。

質問:コードをクリーンで高速に維持しながら、計算エラーを解決するにはどうすればよいですか?

ところで、それがエレガントにできない場合は、呼び出し元を改善して、そのような数値エラーに対してより耐性を持つようにする必要があるでしょう。

編集

(重複した質問を明確にする)

はい、原因はストレージ/計算形式からの精度エラーです (浮動小数点演算は壊れていますか?で説明されています)。

ただし、この質問は、非常に特殊なケースでその症状 を中和する方法について尋ねます。

4

2 に答える 2