僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
GNU coreutils の factor(1)がgmpの有無で動作が変わることは 気づいていたが、その他は未確認だった。
coreutils-8.17/src$ grep gmp.h * expr.c:# include <gmp.h> expr.c:/* Approximate gmp.h well enough for expr.c's purposes. */ factor.c:# include <gmp.h>
grep -ni gmp * は29行あったので、
省略。
Ubuntu-12.04 では libgmp-dev パッケージが要った。
gmp のない環境でビルドされた expr(1) は -(2^63) 以上もしくは 2^63 未満の整数が演算できるらしい。
$ `which expr` `echo -2^63 | bc` / 2 -4611686018427387904 $ `which expr` `echo -2^63-1 | bc` / 2 /usr/bin/expr: -9223372036854775809: 計算結果は範囲外の値です $ `which expr` `echo 2^63-1 | bc` / 2 4611686018427387903 $ `which expr` `echo 2^63 | bc` / 2 /usr/bin/expr: 9223372036854775808: 計算結果は範囲外の値です
coreutils-8.17/src$ two_power_64=`echo 2^64|bc` && echo $two_power_64
18446744073709551616
coreutils-8.17/src$ foo=`expr $two_power_64 + 1` && echo $foo
expr: 18446744073709551616: 計算結果は範囲外の値です
coreutils-8.17/src$ foo=`./expr $two_power_64 + 1` && echo $foo
18446744073709551617
$ ldd `which expr`
linux-vdso.so.1 => (0x00007fff50f50000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed6be4d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fed6c220000)
coreutils-8.17/src$ ldd ./expr
linux-vdso.so.1 => (0x00007fffbc6bf000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fc082a69000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc0826ac000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc082ced000)
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。