Haskell에서`mod`와`rem`의 차이점


130

하스켈 mod과 의 차이점은 정확히 무엇입니까 rem?

둘 다 같은 결과를주는 것 같습니다

*Main> mod 2 3
2
*Main> rem 2 3
2
*Main> mod 10 5
0
*Main> rem 10 5
0
*Main> mod 1 0
*** Exception: divide by zero
*Main> rem 1 0
*** Exception: divide by zero
*Main> mod 1 (-1)
0
*Main> rem 1 (-1)
0

3
Haskell을 모르지만, 이것들이 같은 작업 일 것입니다. modulus == remainder.
Matthew Scharley

공평하게, 그것은 같은 질문이 아니었다. 다른 질문은이 질문에 대한 답을 이해한다고 가정했습니다.
댄 버튼

또 다른 질문의 내가 (이 있었기 때문에 @Dan 독서는 그 질문은, stackoverflow.com/questions/5892188/...를 / :), 나는 같은 실현
오스카 Mederos

2
divquot
newacct의

답변:


181

두 번째 주장이 부정적 일 때는 동일하지 않습니다.

2 `mod` (-3)  ==  -1
2 `rem` (-3)  ==  2

20
나는 약 같은 질문을했다 remmodClojure의의를,이 대답했다.
noahlz

11
첫 번째 주장이 부정적 일 때도 마찬가지입니다. 이러한 까다로운 작업에 대한 자세한 내용은 stackoverflow.com/a/8111203/1535283stackoverflow.com/a/339823/1535283 을 참조하십시오 .
Scott Olson

4
또한 stackoverflow.com/a/6964760/205521 에서 rem가장 빠른 것 같습니다 .
Thomas Ahle

16
이 답변은 정확하지만 "차이가 무엇인가"라는 질문에 "동일하지 않다"고 주장하는 답변은 매우 나쁩니다. 나는 그들이 어떻게 "어떻게"확장 될 수 있다면 그것을 환영 할 것이며 아마도 일부 유스 케이스 일 것이다.
poitroae

59

예, 이러한 기능은 다르게 작동합니다. 공식 문서에 정의 된대로 :

quot 정수 나누기는 0으로 잘립니다.

rem 정수 나머지, 만족 :

(x `quot` y)*y + (x `rem` y) == x

div 음의 무한대로 잘린 정수 나누기

mod 정수 계수이며 다음을 만족합니다.

(x `div` y)*y + (x `mod` y) == x

음수를 두 번째 매개 변수로 사용하고 결과가 0이 아닌 경우 실제로 차이를 알 수 있습니다.

5 `mod` 3 == 2
5 `rem` 3 == 2

5 `mod` (-3) == -1
5 `rem` (-3) == 2

(-5) `mod` 3 == 1
(-5) `rem` 3 == -2

(-5) `mod` (-3) == -2
(-5) `rem` (-3) == -2

 


귀하의 마지막 네 예는, 의미하기 때문에 무엇 아마하지 않습니다 modrem더 강하게보다는 동료 (-). 이 의견에 여러 줄 내용을 넣을 수 없기 때문에 귀하의 의견을 편집했습니다.
Erik Hesselink

1
@ErikHesselink : 편집시 오류가 발생했습니다. (-5) `mod` 3 == 1
Cheng Sun

@ ChengSun 감사합니다, 고쳤습니다. 검토 후 살아야합니다.
Erik Hesselink

16

실제로 말하기 :

당신은 두 피연산자가 모두 긍정적 알고 있다면, 당신은 일반적으로 사용한다 quot, rem또는 quotRem효율성.

두 피연산자가 모두 양수인지 모르는 경우 결과의 모양을 생각해야합니다. 당신은 아마 원하지 quotRem않지만, 당신도 원하지 않을 수도 divMod있습니다. 이 (x `div` y)*y + (x `mod` y) == x법은 매우 좋은 법이지만 음의 무한대로 반올림하는 구분 (Knuth style division)은이를 보장하는 것 0 <= x `mod` y < y(유클리드 분할) 보다 덜 유용하고 덜 효율적 입니다.


5

분할 성만 테스트하려는 경우 항상을 사용해야 rem합니다.

기본적 x `mod` y == 0으로와 x `rem` y == 0같지만 rem보다 빠릅니다 mod.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.