2011-09-12 4 views
9

를 PHP로 비교 왜 루비계수 피연산자 내가 어떻게 루비의 모듈로 피연산자 작품에 대한 간단한 설명을 찾고 있어요

puts 4 % 3 # 1 
puts -4 % 3 # 2 <--why? 
puts -4 % -3 # -1 

이 아니라 PHP에서 :

<?php 

echo 4 % 3; # 1 
echo -4 % 3; # -1 
echo -4 % -3; # -1 

나에게 보이는 -4 % 3은 실제로 8 % 3입니다 (8은 4와 -4의 차이 임).

+3

X 또는 Y 중 하나는 음의 X % Y의 동작을 설계 선택 (여기서 "이 정의 될 수있다 행동"). 아무것도 더, 아무것도 덜. [정수 나누기] (http://www.davidflanagan.com/2006/06/integer-division-and-negative-numbers.html) 및 주석에 대한이 절에서는 더 많은 통찰력을 얻을 수 있습니다. IIRC에서는 루비의 "이상한 행동"에 대한 이유가 ML에서 논의됩니다. –

+1

루비가 일을 한 방법으로하고, PHP가 다른 일을한다면, 루비가 올바른 방법으로하고 있다고 가정하십시오! j/k –

답변

15

그들은 당신의 정의에 따라 모두 올바른 것으로 간주 될 수있다. a % n == r 한 경우 해당를 유지해야합니다 q == a/n

a == q*n + r 

합니다.

r이 양수인지 음수인지는 q의 값으로 결정됩니다. 따라서, 하나의 당신의 예에서 :

-4 == -1*3 + (-1) // PHP 
-4 == -2*3 + 2  // Ruby 

는 다른 말로하면, %의 정의는 /의 정의에 따라 달라집니다.

여기 테이블을 참조하십시오 : http://en.wikipedia.org/wiki/Modulus_operator#Remainder_calculation_for_the_modulo_operation. 이 점은 다양한 프로그래밍 언어간에 크게 차이가 있음을 알 수 있습니다.

+1

아, 이건 나를 위해 나를 만들었 : "%의 정의는 /의 정의에 달려있다." 감사! – typeoneerror

-1

Wolfram Alpha에 따르면 2가 맞습니다.

편집 : PHP가 그런 식으로 작동하는 이유를 묻는 것 같군요?

edit2 : PHP는 이것을 devision A/B의 나머지 부분으로 정의합니다. 당신이 그것을 버그, 잘못, 또는 다른 일을하는 방식으로 생각하든간에 그것은 당신에게 달렸습니다. 개인적으로, 나는 처음 2에 간다.

+1

차이점에 대해 묻고 싶습니다. 올바른 것이 아니므로 PHP가 왜 그렇게 작동하는지 묻고 싶습니다. 이견있는 사람? – typeoneerror

+3

@ 카일 : 버그도 잘못도 아니야. –

6

Here's a snippet (주제 : The Ruby Programming Language, Matz 및 David Flanagan) 피연산자들 중 하나 (그러나 모두)이 음수 인 경우

은 루비와 동일한 정수 나눗셈을 수행 C, C++와 같은 언어 다르게 조작 모듈로, 그리고 자바 수행 (그러나 언어 파이썬 및 티클). -7/3의 지수를 고려하십시오. 루비는 음의 무한대 방향으로 반올림하고 은 -3을 반환합니다. C 및 관련 언어는 대신 0으로 반올림하고 은 -2를 반환합니다. 루비에서, -a/b는 a/-b와 같지만, 같지 않습니다 - (a/b).

Ruby의 모듈 작동 정의 또한 C 및 Java와 다릅니다. Ruby에서 -7 % 3은 2입니다. C 및 Java의 경우 결과는 -1 입니다. 몫이 다르기 때문에 결과의 크기가 다릅니다. 그러나 결과의 표시도 다릅니다. 루비에서 결과의 기호 은 항상 두 번째 피연산자의 부호입니다. C와 Java에서 결과의 부호는 항상 첫 번째 피연산자의 부호입니다. (Ruby의 remainder 메서드는 C 모듈러스 연산자처럼 동작합니다.)

1

실제로 언어의 형 변환/반올림 구현으로 귀결됩니다.실제 방정식이므로 :

a - (n * int(a/n)) 

이 다르다 방정식의 int(a/n) 부분이다. a == -4n == 3이면 PHP는 -1을 반환하고 Ruby는 -2를 반환합니다. 이제 방정식 루비 다음과 같다

-4 - (3 * -2) 

이 PHP

-4 - (3 * -1) 
관련 문제