#31

浮動小数点の誤差(0.1+0.2≠0.3)

小数を2進数で表すと割り切れず誤差が出る仕組みを確かめます。

解説

コンピュータは小数も2進数で記憶しますが、10進数の0.1は2進数では割り切れない無限小数になります。1/3=0.333… が10進数で表しきれないのと同じです。 そのため0.1や0.2はわずかに誤差を含んだ近似値として記憶され、足すと0.3ちょうどにはならず 0.30000000000000004 になります。 これはバグではなく、有限のビットで小数を表すことの宿命です。だから小数の比較は == ではなく「差が十分小さいか」で判定するのが正しいやり方です。

書き方

小数(float)は2進数で表すと割り切れず誤差を含む(0.1+0.2 が 0.3 ちょうどにならない)。
・== は誤差があると False になるので小数の比較に不向き。
・abs(値) で絶対値、abs(差) < 1e-9 で「ほぼ等しい」を判定(1e-9 は 10^-9)。
・format(値, ".17f") で小数点以下17桁まで表示し誤差を見る。

書いて動かす

この回の課題

0.1 + 0.2 が 0.3 と == では一致しないことを確かめ、差を表示し、abs(差) < 1e-9 で「ほぼ等しい」と正しく判定しよう。

コードはあなたの端末の中だけで動きます(サーバーには送られません)。進み具合もこのブラウザに保存されます。

もっと本格的に使うなら

Windows版 InsightPy なら、書いたコードを保存して業務の自動化まで進められます。学習センターはずっと無料です。