하스켈 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
답변
두 번째 주장이 부정적 일 때는 동일하지 않습니다.
2 `mod` (-3) == -1
2 `rem` (-3) == 2
답변
예, 이러한 기능은 다르게 작동합니다. 공식 문서에 정의 된대로 :
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
답변
실제로 말하기 :
당신은 두 피연산자가 모두 긍정적 알고 있다면, 당신은 일반적으로 사용한다 quot
, rem
또는 quotRem
효율성.
두 피연산자가 모두 양수인지 모르는 경우 결과의 모양을 생각해야합니다. 당신은 아마 원하지 quotRem
않지만, 당신도 원하지 않을 수도 divMod
있습니다. 이 (x `div` y)*y + (x `mod` y) == x
법은 매우 좋은 법이지만 음의 무한대로 반올림하는 구분 (Knuth style division)은이를 보장하는 것 0 <= x `mod` y < y
(유클리드 분할) 보다 덜 유용하고 덜 효율적 입니다.
답변
분할 성만 테스트하려는 경우 항상을 사용해야 rem
합니다.
기본적 x `mod` y == 0
으로와 x `rem` y == 0
같지만 rem
보다 빠릅니다 mod
.