정수

정수

스케일이 0이 아닌 경우 3%2, 46%4와 같이 %를 사용한 계산은 0이 출력되는 경향이 있습니다. 0이 아닌 스케일로 알고리즘은 어떻게 설계됩니까?

bc
scale=10
print 4%3   // output 0

답변1

그만큼명령 매뉴얼BC가 모듈로를 계산하는 방법에 대해 다음과 같이 말합니다.

표현식의 결과는 "나머지"이며 다음과 같은 방식으로 계산됩니다. a%b를 계산하려면 먼저a/b숫자의 크기를 조정하여 계산됩니다. 그 결과는 계산에 사용됩니다.a - ( a/b ) * bscale+scale(b)와 scale(a) 중 최대 규모까지.scale이 0으로 설정되고 두 표현식이 모두 정수인 경우 이 표현식은 정수 나머지 함수입니다.


편집하다: 나는 GNU BC의 소스 코드를 살펴본 후 mod 연산자가 나누기 연산자를 확장한다는 것을 발견했습니다. 즉, 모듈로는 나누기의 부산물로 계산됩니다. 모듈로를 계산하기 위해 정수 나누기에 의존합니다. 를 설정 하면 scale정수 나누기가 발생하지 않습니다.

BC주에서 이것을 시도해 보세요:

bc
scale = 0
print 5/2

scale = 5
print 5/2

당신은 얻을 것이다 :

2        << Integer Division
2.50000  << NOT integer division!

이제 BC 방식대로 이 수치를 연결해 보겠습니다. 설명서에는 사용한다고 나와있어요a-(a/b)*b계산하다. 두 가지 결과, 즉 정수 나누기 결과와 scale0이 아닌 결과를 연결해 보겠습니다.

a - ( a/b ) * b
5 - ( 2   ) * 2  = 1  << CORRECT!
5 - ( 2.5 ) * 2  = 0  << VERY WRONG!

정수 나누기가 없는 경우:

a - ( a/b ) * b == a - (  a  ) == 0

이것이 모듈로가 제대로 작동하려면 스케일을 0으로 설정해야 하는 이유입니다.
문제는 BC의 디자인과 '스케일'로 숫자를 처리하는 방법에서 발생하는 것 같습니다. 모듈로가 올바르게 작동하려면우리는 정수 나누기가 필요합니다.

있다다른많이더 발전된 도구이러한 목적을 위한 무료 오픈 소스이므로 사용을 권장합니다.

답변2

user272970의 답변은 훌륭합니다. 여기에 약간의 변화가 있습니다:

define int(x) { auto oldscale; oldscale=scale; scale=0; x=x/1; scale=oldscale; return( x ); }
define fmod(x,y) { auto oldscale; oldscale=scale; scale=1000; x = x - y * int(x/y); scale=oldscale; return( x ); }

이를 사용하면 함수에 로컬이 auto oldscale됩니다 . oldscale그렇지 않으면 fmod()에서 설정하면 oldscale에 저장하려는 것을 int()덮어쓰게 되고 을 호출하기 전에 설정한 값 대신 1000으로 설정 됩니다 .oldscalefmod()scalefmod()

이 기능을 추가하고 ~/.bcrc환경 BC_ENV_ARGS변수를 ~/.bcrc. 그러면 bc를 실행할 때마다 이러한 함수가 로드됩니다. 이제 fmod(x,y)매번 수동으로 해당 함수를 정의할 필요 없이 BC에 있을 때 언제든지 실행할 수 있습니다.

ps scale1000은 대부분의 경우 과잉일 수 있습니다.

답변3

저는 이 방법으로 해결했습니다.

정수

int(x) 정의 { oldscale=scale; 규모=0; x=x/1; 규모=오래된 규모; 반환(x); }

모듈로

mod(x,y) 정의 { oldscale=scale; 규모=1000; x = x - y * int(x/y); 규모=오래된 규모; 반환(x); }

HTH

답변4

다른 답변에서 말했듯이 현재 에서 평가된 a%bas 를 정의한 결과입니다 . 이는 정수 모듈러스로 작동하려면 와 함께 사용해야 함을 의미합니다 .(a-(a/b)*b)scalescale=0

그러나 나는 그것이 "잘못"이라는 데 동의하지 않습니다. 특히 오류를 평가하는 데 잠재적으로 유용한 도구입니다.

scale=5
1/3
> .33333
1%3
> .00001

7/13소수점 4자리로 표현하면 무엇을 잃게 될까요 .5384?

scale=4
7/13
> .5384
7%13
> .0008

보기에 0.0008/13.

그리고 마지막으로 정수 사용을 고집하지 않기 때문에 소수점 이하 자릿수를 추출하는 데에도 사용할 수 있습니다.

scale=1
123.456/1
> 123.4
123.456%1
> .056

관련 정보