有没有办法在 中使用带有小数部分的指数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
,它附带了一个数学函数库,您可以通过选项启用它-l
。
该e()
库包含exp()
以l()
.ln()
bc
您可以尝试重新实现其中的算法dc
(祝您好运),或者bc
直接使用。一些 shell 也内置了对浮点指数的支持。或者你可以使用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
截断而不是四舍五入到最接近的)。
¹ zshdouble
在内部使用二进制浮点类型,而 ksh93 使用long double
;zsh
使用 17 位精度来表示double
十进制数字,这保证了忠实的表示,但意味着最后几位数字至少可能不准确。