BC가 스케일을 올바르게 처리하지 않음 = 0

BC가 스케일을 올바르게 처리하지 않음 = 0

큐브 루트를 반환하는 cbrt 함수를 정의했습니다. 정수를 반환해야 합니다(큐브 루트에 가깝더라도 제 경우에는 허용됩니다). 그러나 정수를 얻기 위해 척도를 0으로 설정하면 매우 잘못된 숫자가 나타납니다. 무슨 일이 일어나고 있으며 정수의 세제곱근을 얻는 방법은 무엇입니까?

bc -l
define cbrt(x) { return e(l(x)/3) }
scale=1;cbrt(1000000)
99.4
scale=0;cbrt(1000000)
54

답변1

scale이전 설정을 호출하면 cbrt()동시 평가를 설정하는 효과가 있습니다. 해결책은 스케일을 함수의 일부로 저장하는 것입니다.scalecbrt()

define cbrt(x) { auto z, var; z=scale; scale=5; var = e(l(x)/3); scale=z; return (var); }

호출되면 다음이 제공됩니다.

scale=0; cbrt(1000000)
99.99998

이것 은 요점 을 놓친 것 같습니다 scale=0. 이는 cbrt()임시 설정 5 scale~5를 평가하고 세제곱근(5개 부동 소수점)을 계산하여 할당 z하고 반환하기 때문입니다.저것값(암시적으로 scale5로 설정됨). 그런 다음 scale=0간단히 1로 나누어 로컬 값을 적용 할 수 있습니다 .

scale=0; cbrt(100000)/1
99

관련 정보