Big_int.extract_big_intが変
let n = 100 let b = shift_left_big_int unit_big_int n |> pred_big_int (* 111...11 *) let k = 2;; for i = 0 to n - k do let m = (extract_big_int b i k |> int_of_big_int) in if m <> int_exp 2 k - 1 then Printf.printf "%d : %d\n" i m; (* failed *) done
とすると
31 : 1 63 : 1 95 : 1
が出力される(OCaml version 3.12.1, Ubuntu 10.04 32-bit)。
extract_big_intはbig_int型の値を2進数表示したものの指定した桁(上ではi)から指定した長さ(上ではk)bitsを切り出す関数であり、例えば2^n-1からならどこから切り出しても連続した1が出てくるはずなのだがそうなっていない、という話。ちなみに64-bitアーキテクチャでは64桁ごとに失敗する。こういう仕様だと言われたらそれはそれで納得できなくもない気もするが。