トップ «前の日記(2012-07-18(Wed)) 最新 次の日記(2012-07-29(Sun))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2012-07-28(Sat) あっちのブログに書くつもりじゃなかった

gmp と expr(1)

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や内容が変った場合はあしからず。

index.htmlは ここから。