萌えハッカーニュースリーダー

2025/06/27 15:57 Most ints are not floats

出典: https://www.johndcook.com/blog/2025/06/27/most-ints-are-not-floats/
hakase
博士

やあ、ロボ子。今日は整数と浮動小数点数の関係について話すのじゃ。

roboko
ロボ子

博士、こんにちは。整数と浮動小数点数ですか。いつも使っていますが、改めて聞くと難しそうですね。

hakase
博士

難しくないぞ! すべての整数は実数だけど、コンピュータの中では整数の表現と実数の表現は違うことが多いのじゃ。

roboko
ロボ子

表現が違う、ですか。例えばどんな違いがあるんですか?

hakase
博士

例えば32bitの場合、`int32`は-2<sup>31</sup>から2<sup>31</sup>-1までの整数を表せる。一方、`float32`は±1.*f* × 2<sup>*e*</sup>の形式で数値を表現するのじゃ。*f*が23bit、*e*が8bitじゃ。

roboko
ロボ子

`float32`の形式、久しぶりに見ました。ということは、`float32`で表現できる数には限界があるんですね。

hakase
博士

その通り! 2<sup>24</sup>は`float32`で正確に表現できるけど、2<sup>24</sup>+1は*f*のビット数制限で正確に表現できないのじゃ。

roboko
ロボ子

なるほど。`int32`で表現できる非負整数のうち、`float32`で正確に表現できるのは約9 × 2<sup>23</sup>個、つまり約3.5%しかないんですね。意外と少ない…。

hakase
博士

そうじゃろ? 64bitだと、`float64`は±1.*f* × 2<sup>*e*</sup>の形式で、*f*が52bit、*e*が11bitじゃ。`int64`で表現可能な非負整数のうち、`float64`で正確に表現できるのは約11 × 2<sup>52</sup>個、約0.5%になるのじゃ。

roboko
ロボ子

64bitでも割合は少ないんですね。Pythonだとどうなるんですか?

hakase
博士

Pythonの整数は範囲に制限がないけど、浮動小数点数は`float64`に対応しているのじゃ。整数が浮動小数点数として表現できないのは、浮動小数点数の最大値を超えるか、53bit以上の精度が必要な場合じゃな。

roboko
ロボ子

Pythonの整数は範囲に制限がないから、大きな数を扱うときは便利ですね。でも、浮動小数点数に変換すると精度が落ちる可能性があることを覚えておかないといけませんね。

hakase
博士

その通り! 特に金融関係の計算とか、精度が重要な場合は注意が必要じゃ。ところでロボ子、今日は何の日か知ってるか?

roboko
ロボ子

えっと…特に何もなかったような…。

hakase
博士

ブー! 今日は「小数点以下切り捨ての日」じゃ!……って、そんな日ないけどな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search