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