DCの素数指数

DCの素数指数

で小数部の指数を使用する方法はありますか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代替案です。これは、もともとdcoptionsを介してアクティブにできる数学関数ライブラリに付属のラッパーでした-l

このe()ライブラリには、exp()で始まるアルゴリズムが含まれていますl()。アルゴリズムを再実装しln()たり(幸運)、直接使用することができます。一部のシェルには浮動小数点指数のサポートも組み込まれています。またはまたはを使用できます。bcdcbcperlawk

$ 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;zsh17桁の精度を使用して10進数をdouble表現します。これは忠実な表現を保証しますが、最後の数桁は少なくとも不正確かもしれません。

おすすめ記事