펄의 버그?
글쓴이: Munsen / 작성시간: 토, 2007/12/08 - 8:48오후
대부분의 프로그래밍 언어에는 % 연산자가 있습니다. 나눗셈의 나머지를 구하는 연산자죠.
얼마전에 Perl로 Xchat용 계산기를 만들었습니다. 그러다가.. 지인이 테스트해준다더군요.
그러다보니 Perl의 % 연산이 C의 그것과 다르다는 걸 알아냈습니다.(수학적으로봐도 틀립니다.)
저는 수학을 못합니다. 그래서 지인이 알려주길.
"정석을 보면 너무 오래전에 봐서 기억은 가물가물하지만.
정수 a를 정수 b로 나눈 몫을 q 나머지를 r 이라고 하면
a=bq+r이라고 한다 (0 =< r < b)"
#!/usr/bin/perl print 3 % -7 . "\n"; # 3 % -7을 출력
위의 코드에서는 -4를 출력합니다.
#include <stdio.h> int main(void) { int a = 3; int b = -7; printf("%d %% %d = %d\n", a, b, a % b); return 0; }
이 코드에서는 3을 출력합니다.
여담으로 bc께서는 3이라고 합니다.
Forums:
Modulo operation
Modulo operation
a = bq + r.. 에서 r의
a = bq + r
.. 에서 r의 범위를 저렇게 얘기하는 게 일반적인 건
a와 b가 음이 아닌 정수일 때고요.
( 사실 r의 범위를 저렇게 잡는 건 다른 문제 풀 때 쓰는 '가정'이죠. )
그 외의 경우,
a와 b가 주어졌을 때 나오는 (q, r)의 쌍이
a = bq + r 로만 나오면 버그라고 보기 어렵습니다.
예를 들어,
a = 7, b = -3 일 때,
(a/b, a%b) = (-2, 1), (-3, -2) 는 보통 옳은 구현으로 보지만,
(a/b, a%b) = (-2, -2), (-3, 1) 는 보통 틀린 구현으로 보죠.
역시
a = -7, b = -3 일 때,
(a/b, a%b) = (2, -1), (3, 2) 는 보통 옳은 구현으로 보지만,
(a/b, a%b) = (3, -1), (2, 2) 는 보통 틀린 구현으로 봅니다.
그렇군요. 인용:(
그렇군요.
이건 가정이 아니라 공리인듯합니다.
http://en.wikipedia.org/wiki/Modulo_operation
수학에서는 양수인게 일반적인 것 같습니다. 물론 음수로 해도 틀린건 아니라고 하네요.(-_-;)
gamdora님이 거신 링크에 잘 설명 되어 있네요
양수 나누기 양수는 결과가 딱 하나지만
부호가 둘다 음수이거나 한 쪽이 음수라면 2가지 결과를 생각해 볼 수 있습니다.
3 / -7 의 몫을 0으로 보면 나머지가 3이 나올테고 (-7 * 0 + 3 = 3)
-1로 보면 나머지가 -4가 나옵니다 (-7 * -1 - 4 = 3)
나머지가 양수로 나오느냐 음수로 나오느냐는 언어마다 다릅니다.
c는 나머지의 부호를 피제수(3)와 같게 하고
Perl은 제수(-7)와 같게 하기 때문에 다른 결과가 나오는 것입니다.
:)
저는 수학적인
저는 수학적인 내용은 모르겠습니다만,
공식문서에도 나와있듯이, 이는 펄의 `특징'입니다. (`버그'가 아니고..)
출처 : http://perldoc.perl.org/perlop.html#Multiplicative-Operators
--------------------Signature--------------------
Light a candle before cursing the darkness.
http://kldp.org/node/55978
http://kldp.org/node/55978
댓글 달기