doubleを一度メモリに入れると値がずれる

よくある話です。 浮動小数点演算ではまった話 - bkブログにあるのと本質的には同じ。 要約すると #include<stdio.h> double a[100]; int main(int argc, char *argv[]) { volatile union{ long long a; double d; } A, B; A.a = 0xfff0000000000001LL; B.d = A.d; //</stdio.h>…

Pervasives.compareしてはいけない型 (2): Set.S.t, Map.S.t, Big_int.big_int

Pervasives.compare というか、 = で比較できない、あるいはしても意味がない型について。 OCaml 3.10.0 (Cygwin) にてテスト。 Set.S.t Set.S.compare を使いましょう。Pervasives.compareで比較すると、集合として正しく比較できません。 module IntSet = …

華麗に型推論をすり抜ける

誤: print_string( (Printf.sprintf "%s = %s;\n" "a" "b") ^ (Printf.sprintf "%s = %s + %s;\n" "a" "b") (Printf.sprintf "%s = %s;\n" "a" "b") )正: print_string( (Printf.sprintf "%s = %s;\n" "a" "b") ^ (Printf.sprintf "%s = %s + %s;\n" "a" "b"…

list_map_and_concat

リストの各要素に0要素以上を対応させてつなぎたい時。

list_map_partial

type t = A of int | B of stringみたいな場合に、t listから A(i)のiだけ取り出して int list を作りたい時など。

Pervasives.compareできない型

let a = Big_int.succ_big_int Big_int.zero_big_int in let b = Big_int.unit_big_int in a = bとかすると Fatal error: exception Invalid_argument("equal: abstract value")と実行時に出る。 コンパイル時に型推論的にはじいてくれないだろうか。ちなみ…