DB2 で次の SQL ステートメントを実行すると* が返されるのはなぜ0.1
ですか?
select FLOAT(0.1) from sysibm.sysdummy1
for のような近似結果を期待していましたREAL(0.1)
。
丸めが行われる理由と場所
* Visual Explain の使用
DB2 で次の SQL ステートメントを実行すると* が返されるのはなぜ0.1
ですか?
select FLOAT(0.1) from sysibm.sysdummy1
for のような近似結果を期待していましたREAL(0.1)
。
丸めが行われる理由と場所
* Visual Explain の使用
これは推測にすぎませんが、多くのシステムでは、出力用に浮動小数点値をフォーマットするときに、他のどの浮動小数点数よりも結果に近い最短の数値を出力します。FLOAT は倍精度で、REAL は単精度であるため、"0.1" は異なる 2 進近似に丸められます。そのうちの 1 つで、0.1 は形式の他の値よりも丸められた値に近い可能性があります。一方、そうではありません。
10 進値 0.1 の 32 ビット (単精度) と 64 ビット (倍精度) 表現には違いがあります。オンラインのIEEE 754計算機を使用して、それを確認できます。
32 bit: 0.09999999403953552 (3DCCCCCC)
64 bit: 0.1 (3FB999999999999A)
IBM DB2のドキュメントを確認したところ、実際にはFLOAT関数はDOUBLEの同義語であるため、64ビット表現を返します。これは正確に近似値0.1として示されています。
REAL 関数は、数値の単精度浮動小数点表現を返します。
FLOAT 関数は、数値の浮動小数点表現を返します。FLOAT は DOUBLE のシノニムです。