浮動小数点演算

GROMACS は、主に実数に対する演算を行い、多くの場合、数百万もの実数を合計することに専念しています。 これらの実数は、コンピュータ上で「二進数浮動小数点」という形式でエンコードされます。 この形式は、科学的な指数表記(ただし、十進数ではなく二進数を使用)に似ており、計算の高速化には不可欠です。 ただし、代数学の法則は、二進数浮動小数点に対しては近似的にしか適用されません。 これは、十進数で単純かつ正確に表現できる実数(例:1/5=0.2)が、二進数浮動小数点では正確な表現を持たないためです。 1/3も十進数では表現できません。 この問題についてより詳細に議論している情報源は、Wikipedia や、デービッド・ゴールドバーグの1991年の論文「What every computer scientist should know about floating-point arithmetic」(article, addendum) など、検索エンジンで検索できます。 ブリュース・デイソンは、Random ASCII site で、現代の浮動小数点プログラミングに関する非常に価値のあるブログ記事を多数公開しています。

したがって、正確な十進数の多数のバイナリ表現の合計は、期待される代数または十進の結果と一致しない場合があります。ユーザーは、2桁で表現された部分電荷の合計でこの現象を観察します。これらの合計は、それらが貢献する整数合計電荷をある程度近似する場合があります(ただし、最初の桁でずれが生じる場合は、必ず不適切な構造を示します)。|Gromacs|がこのような浮動小数点数を出力で表現する必要がある場合、しばしば科学表記として知られるコンピュータ形式のE表記を使用します。このような表記では、-9.999971e-01という数値は実際には-0.9999971であり、これはシステムの合計電荷を評価するのに十分なほど-1に近い値です。

また、|Gromacs|が自動的に値を丸めることは適切ではありません。なぜなら、このような丸めは、必ずしも真実である必要のない入力に関する仮定に基づいているからです。そのため、ユーザーは、使用しているツールがどのように動作するかを理解する必要があります。