32.3 小数とその計算

10年や100年,1000年の秒数について先ほどは1年を365日として計算しましたが,閏年の効果を考えて1年を平均365.24日として計算した方がより正確な値が求まることが期待できます.つまり,小数を使いたいということになります.

OCamlでは小数を書いたら,浮動小数点数と呼ばれる値だと考えます.詳しい説明はhwb18.3.3 浮動小数点表現の精度・範囲と特別な値を見てもらうとして,浮動小数点数を利用することで,有効数字の桁数に制限があるかわりに,値自体は非常に大きな値から非常に0に近い値まで扱えます.そのため1000年の秒数を計算しても値が減ることはありません(それでも限りはあります).

小数自体は書くのは簡単ですが,計算をするには注意しなければならない点がいくつかあります.先に例を見ましょう.

60.0 *. 60.0 *. 24.0 *. 365.24 *. 10.0;;return2
- : float = 315567360.
60.0 *. 60.0 *. 24.0 *. 365.24 *. 100.0;;return2
- : float = 3155673600.
60.0 *. 60.0 *. 24.0 *. 365.24 *. 1000.0;;return2
- : float = 31556736000.

それらしい結果になりましたね.

注意しなければならないというのは,一つは演算子にも“.”を付ける必要があるということです.つまり,小数のかけ算には“*”ではなく“*.”を使います.

もう一つ,小数の計算をする時はすべての数は小数にしなければなりません.つまり“60”ではなくて,“60.0”のように書かなければいけません.

このように整数と小数を区別しなければいけないのは,コンピュータの内部ではこの2つは全く違った形式で表わされているためです.プログラム言語によっては自動的に整数と小数を変換するものもありますが,OCamlではそのようなことをしないため,プログラムを書く人が気を付ける約束になっています.

ちなみに整数と小数を計算してしまうと次のようなエラーになります.

60 * 60.0;;return2
Error: This expression has type float but an expression was expected of type int
60 *. 60.0;;return2
Error: This expression has type int but an expression was expected of type float

このようなメッセージを見た場合は,整数と小数を間違っていないか確認するのがよいでしょう.

小数のまとめ

小数とその計算についてまとめます.

  • 小数点が付いた数値を書くと小数と見なされます.
    3.7;;return2
    - : float = 3.7
    -5.;;return2
    - : float = -5.
  • 数値の後に“e”と桁数を書くことで,指数を使った数を書くことができます.
    2.6e5;;return2
    - : float = 260000.
    -52e-4;;return2
    - : float = -0.0052
  • 小数の加減乗除はそれぞれ“+.”, “-.”, “*.”, “/.”という記号を使います.
    7. /. 3.;;return2
    - : float = 2.33333333333333348
  • その他,括弧の使い方などは整数の場合と同じです.
  • 小数の計算では,整数を用いることができません.