SSブログ

分数を小数に展開と桁あふれと OCaml Sucks [OCaml]

無い知恵を絞って「どう書く?org」の「分数を小数に展開」という問題 [1] にOCaml で投稿してみた [2]。

投稿した後で別の方が「2147483645 / 2147483647 で~」と書いていたので、そういえば問題文の境界値 2^31-1 は OCaml の int では満たせないんだったと気がついたのだけど、じゃあ 2^30-1 の 1073741823 までならできるんだっけと思ってやってみると、

# pretty_fmt (decimal_of_frac 1073741823 1073741823);;
- : string = "1."
# pretty_fmt (decimal_of_frac 1073741823 1073741822);;
- : string =
"1.00000000000000000000000000000-1{0000000000000000000000000000-1}"
# pretty_fmt (decimal_of_frac 1073741822 1073741823);;
- : string =
"0.0000000000000000000000000000{-100000000000000000000000000000}"

あれ…

バグかなあと悩むことしばしの後、どうやら剰余を10倍しているところで桁あふれがおきているのだと気づきました。これはもっと複雑なことをしているときに起こったらかなりはまるだろうなあ。

というわけで OCaml Language Sucks [3] の人が "The biggest trouble is that integer overflow is not detected even at run run time" (原文ママ)と言っているのはこういうことかというのを身をもって理解したのでした。

他の言語の投稿でも普通に int を使っているものは問題文の境界値内で桁あふれが起こるのかな。気にしなくていいのは Python と Common Lisp くらい?

[1] http://ja.doukaku.org/9/
[2] http://ja.doukaku.org/comment/198/
[3] http://www.podval.org/~sds/ocaml-sucks.html


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

ピラミッドを作る (Excel)Lua で小町算 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。