で小数部の指数を使用する方法はありますかdc
?
例:
user@box:~$ dc
9k
2 2 ^ p
4
2 2.5 ^ p
Runtime warning: non-zero scale in exponent
4
マニュアルページには次のように記載されています。
Arithmetic
...
^ Pops two values and exponentiates, using the first value popped
as the exponent and the second popped as the base. The fraction
part of the exponent is ignored. The precision value specifies
the number of fraction digits in the result.
指数の小数部は無視されます。
簡単に見えますが、この問題を簡単に解決する方法はありますか?
答え1
いいえ、そうしないdc
でください。アルゴリズムを手動で実装する必要があります。bc
代替案です。これは、もともとdc
optionsを介してアクティブにできる数学関数ライブラリに付属のラッパーでした-l
。
このe()
ライブラリには、exp()
で始まるアルゴリズムが含まれていますl()
。アルゴリズムを再実装しln()
たり(幸運)、直接使用することができます。一部のシェルには浮動小数点指数のサポートも組み込まれています。またはまたはを使用できます。bc
dc
bc
perl
awk
$ echo 'e(2.5 * l(2))' | bc -l
5.65685424949238019507
$ ksh93 -c 'echo "$(( 2 ** 2.5 ))"'
5.6568542494923802
$ zsh -c 'echo $(( 2 ** 2.5 ))'
5.6568542494923806¹
$ perl -le 'print 2**2.5'
5.65685424949238
$ awk 'BEGIN{printf "%.15g\n", 2 ^ 2.5}'
5.65685424949238
またはより高い精度が必要な場合:
$ echo 'scale = 50; a = e(2.5 * l(2)); scale = 39; a/1' | bc -l
5.656854249492380195206754896838792314278
$ perl -Mbignum -le 'print 2**2.5'
5.656854249492380195206754896838792314279
$ gawk -Mv PREC=400 'BEGIN{printf "%.40g\n", 2^2.5}'
5.656854249492380195206754896838792314279
(bc
一番近いものに丸めずに切ります。)
¹zshはdouble
内部でバイナリ浮動小数点型を使用し、一方ksh93はlong double
;zsh
17桁の精度を使用して10進数をdouble
表現します。これは忠実な表現を保証しますが、最後の数桁は少なくとも不正確かもしれません。。