これは物理エンジンの一部です。
単純化された関数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%)、厄介な物理学の発散をもたらすことがあります。
これを解決するにはいくつかの方法があります。たとえば、いくつかの条件付きチェックを大幅に実行します。
ただし、それは私にとって非常にエラーが発生しやすいです。
質問:コードをクリーンで高速に維持しながら、計算エラーを解決するにはどうすればよいですか?
ところで、それがエレガントにできない場合は、呼び出し元を改善して、そのような数値エラーに対してより耐性を持つようにする必要があるでしょう。
編集
(重複した質問を明確にする)
はい、原因はストレージ/計算形式からの精度エラーです (浮動小数点演算は壊れていますか?で説明されています)。
ただし、この質問は、非常に特殊なケースでその症状 を中和する方法について尋ねます。