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자리의 정밀도를 사용하여 double십진수를 표현합니다. 이는 충실한 표현을 보장하지만 마지막 몇 자리는 적어도 부정확할 수 있음을 의미합니다..

관련 정보