17.4.2 十年・百年・千年の秒数と整数の範囲

では10年秒数と100年の秒数と1000年の秒数を計算させてみましょう. どのような式を入力すればよいかは, もう分かりますね?

# 60*60*24*365*10;; return2 - : int = 315360000 # 60*60*24*365*100;; return2 - : int = 1006116352 # 60*60*24*365*1000;; return2 - : int = -676254720 #

10年の秒数はこれで良さそうですが, 100年, 1000年の秒数はその10倍, 100倍になっていませんね. これは, 計算結果が Ocaml 処理系が扱える整数の範囲を超えてしまったことによる現象です.

Ocaml処理系は整数を 30 ビットで表わしているため, 整数としては 1,073,741,823 から -1,073,741,824 までの数しか扱えません. 例えば100年の秒数は 3,153,600,000 のはずですが, この範囲を超えてしまったので2進数で下から 30ビットぶんだけ取り出し, それ以上の桁を省いてしまっています. そのためにおかしな結果となるのです.

ついでに言えば, 上の計算では一年の日数を 365 としています. しかし, 100年分の秒数を計算する場合には, 閏年の効果を考えて一年は平均 365.24 日としておくべきでしょう.

一年を365.24日としたり, 100年の秒数や1000年の秒数のように大きな数を計算する場合は, 実数を使って計算することができます. では次に実数による計算の方法を見てみましょう.