分数を小数に展開と桁あふれと 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
2007-07-06 12:31
nice!(0)
コメント(0)
トラックバック(0)
コメント 0