わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

bcでべき乗

困ったときの加減乗除は,ターミナルを開いてbc.
なのですが,3乗して0.6になる数,つまり「0.6の立方根」でも「0.6の1/3乗」でも,Cの数学関数を使って「pow(0.6,1.0/3.0)」でもいいので,そういう値を求めることはできましたっけ?
とりあえず,いくつか試します.

$ bc
bc 1.06.94
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=20
1/3
.33333333333333333333
0.6**(1/3)
(standard_in) 3: syntax error
0.6^(1/3)
Runtime warning (func=(main), adr=10): non-zero scale in exponent
1
pow(0.6,1/3)
Runtime error (func=(main), adr=11): Function pow not defined.

bcのべき乗演算子は「^」でしたか.それにしてもよく分からないエラーメッセージなので,manpageを引くと

expr ^ expr
式の結果は、1 番目の式の値を 2 番目の回数だけ乗じたものになります。 2 番目の式は、整数でなければなりません。 (2 番目の式が整数でない場合は警告が表示され、整数に切り詰めた値が使用されます。)
http://www.linux.or.jp/JM/html/GNU_bc/man1/bc.1.html

ありゃ.1/3乗はダメなのですね.
もう少し調べて…

bc に -l オプションを付けて起動した場合は、数学ライブラリが読み込まれ、デフォルトの scale が 20 に設定されます。数学関数は、それを呼び出した時点の scale の値に従って計算を行います。数学ライブラリによって使用可能になる関数は、次の通りです:
(略)

l (x)
log (自然対数)
e (x)
exp (指数関数)

これを使いましょう.指数と自然対数の関係は,忘れかけていたので,手元でメモ.

  • z=x^y
  • \log_e z=y\log_e x
  • z=e^{y\log_e x}

ということで,xのy乗は,bcの式にすると「e(y,l(x))」とすればいいの,と.
動作確認.

$ bc -l
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
e(0.5*l(2))
1.41421356237309504878
e(0.5*l(3))
1.73205080756887729351
e(1/3*l(0.6))
.84343266530174924285
.84343266530174924285^3
.60000000000000000000

はじめのふたつは,動作確認用の「ルート2」「ルート3」です.
「0.6の1/3乗」と合わせて,うまくいっているようです.
そうだ.

$ ruby -e 'puts 0.6**(1.0/3)'
0.843432665301749