2012-08-23 3 views
4

가능한 중복 : 내가 이해에서
How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbersC/C++의 실수 모듈 연산자?

(Modulo operationModulo operator with negative values 참조) C & C++는 "나머지"연산자 a % b하지만 실제로 모듈러 산술을 수행없이 운영자가 LHS는 부정적입니다.

여러 언어에 이러한 기능이 있습니다. C/C++에서 효율적인 함수를 빌드하는 것이 가능합니까 (아니면 i686/x64 CPU에서 효율적인 방법이 있습니까)?

현재 (n * b + a) % b을 사용하고 있는데, n이 선택되어 전체 LHS가 음수가 아니라는 것이 확실하지만 필연적으로 코드가 변경되고 때때로 버그가 발생합니다.

참고 : 명확하지 않은 경우 모듈 식 산술이란 연산자가 a + b % b = a % b이고 모든 정수가 a이고 모든 양의 정수가 b 인 연산자를 의미합니다.

+1

http://stackoverflow.com/questions/4003232/how-to-code-a-modulo-operator-in-c-c-obj-c-that-handles-negative-numbers – Andrey

+0

정수로 작업 하시겠습니까? 그렇지 않으면 나는'std :: fmod'를 추천 할 것이다. – Ruud

+0

정수, 예. 대체로 배열 인덱스입니다. – dhardy

답변

11

간단한 방법은 없지만 두 줄 솔루션을 만들고 더하기 곱하기 여분을 n으로 설정하면 더 효율적입니다.

  if(b < 0) return modulo(-a, -b); 
+0

"할 수있는 간단한 방법이 없습니다"... 정말요? 귀하의 솔루션은 나에게 매우 간단 해 보입니다. +1 – JeremyP

+0

와우, 정말 빨랐어 요! 나중에 성능을 테스트 할 것이지만 점프가 중요하지 않으면 ATM을 사용하는 것보다 속도가 훨씬 느릴 것입니다. – dhardy

2

내가 위의 것과 같은 기능을 제안하지만, 마찬가지로 (inline int modulo(int a, int b) {}를 사용 : 당신은뿐만 아니라 부정적인 b 번호를 올바르게 작동해야하는 경우

또한
inline int modulo(int a, int b) { 
    const int result = a % b; 
    return result >= 0 ? result : result + b; 
} 

, 처음에 추가 연산자가 C++에 존재한다면). 개인적으로 음수는 자주 사용하지 않으며 코드가 음수를 사용하지 않을 때마다 %을 유지해야한다고 생각합니다.

+0

답변에 인라인 제안을 추가했습니다. 감사. – Lorlin

+0

문제는 코드가 변경되고 한 번 부정적이지 않은 것이 때때로 부정적으로 끝나는 경우입니다. 나는 장소에서 assert와 함께 %를 사용할 수도 있지만 (디버그 모드 성능에 대해서는별로 신경 쓰지 않는다). – dhardy

+0

@dhardy 코드가 변경된다는 것은 무엇을 의미합니까? 내가 말했던 사례는 예를 들어 어레이 인덱스 (절대 <0) 또는 증분 카운터입니다. – maxbc