一般的なCライブラリ関数とともに使用した場合の不整合
一般的なCライブラリ関数で浮動小数点データを使用すると、異なるコンパイラとサポートするライブラリの間で不整合になる可能性があります。例えば、Cランタイム ライブラリの三角関数は、Linuxのバージョンやディストリビューションによって、わずかに異なる値を返すことがあります。
比較と計算における不正確性
浮動小数点数はそのままの値では保管されないので、比較や計算での使用時になんらかの誤差が持ち越されて排除できません。
以下に、生じうる問題をいくつか示してあります。
- 浮動小数点の計算においては、同じ計算であっても、マシンによって若干異なる結果が生成されることもあります。これは、コンピュータごとに、あるいは同じシリーズのコンピュータであってもモデルごとに、内部の精度が違っているためです。
- 一般的に、浮動小数点の10進値は正確なバイナリ表現を持たないため、浮動少数点値が関係する計算では、予想外の結果になることがあります。例えば、一般的な10進数の0.1は、バイナリでは繰り返しのシーケンスになり、正確なバイナリ表現がありません。計算を実行して、その結果を何らかの期待値と比較すると、意図した結果になる可能性は非常に低くなります。
- サイズが大きく異なる浮動小数点値を加算または減算すると、小さい方の数の結果が事実上失われる可能性があります。例えば、1E20 + 1.0と1E20 - 1.0は1E20に評価されます。
- 次のように、浮動小数点数を使った演算は、概算および四捨五入のエラーのせいで常にそれぞれが相互に関連しあっているとは限りません。 ((A + B) + C)は必ずしも(A + (B + C))に等しいわけではありません。
また、まだ明白ではありませんが、浮動小数点値の算術の非結合性が集計操作に影響を与える可能性もあります。 所定の浮動小数データで集約関数を使うたびに、異なる結果になることがあります。SQL Engineが集約を実行する場合、最終的な結果を生成するために、計算に含まれた各AMPから個々の条件を累積して条件を評価します。 評価の順序によって、結果が多少異なる場合があり、また個々のAMPがそれらの作業を終了する順序が予想できないため、同じシステム上の同じデータの集約関数の結果が異なることがあります。
- 10進値および整数値を浮動小数点数値に変換すると、精度が喪失するか、または正確に表現できない数字を生じることになります。
- FLOATタイプに対してGROUP BYを使用すると、整合性のない結果を生じることがあります。
正確な結果が必要な場合、浮動小数点数タイプを使用しないでください。