2016-08-23 20 views
0

매개 변수와 함께 사용할 때 while 루프의 조건에 "적합"하지 않는 fmod()에 문제가 있습니다. 아래의 스 니펫을 재 작성했는데, 이는 주 프로그램과 동일한 오류를 발생시킵니다.Fmod While While 루프 조건 오류

#include <math.h> 
int main() 
{ 
    double foo = 223.76; 
    double bar = foo; 
    while(fmod(bar,1.00) != 0) 
    { 
     bar += foo; 
    } 
    cout << bar << endl; 
} 

위의 코드는 결국 5594를 중지하고 인쇄해야하지만 대신 수백만 개가 계속됩니다. 각 단계에서 막대의 값을 인쇄하면 실제로 5594 (테스트하려는 경우 약 25 단계가 소요됨) 값에 도달하므로 실제로 멈추지 않는 이유를 알 수 없습니다.

+3

불규칙한 값의 합계를 반복하고 정확한 숫자와 비교하여 부동 소수점 프로그래밍의 추기경 죄 (the Cardinal Sins of Floating Point Programming). 이것은 결코 작동하지 않습니다. 쉬운 솔루션을 위해 100을 곱하십시오. –

+0

'223.76'은 2의 거듭 제곱 인 경우에만 (일반 C++ 구현으로) 정확하게 표현할 수 있습니다. –

+0

글쎄, 나는 0.00과 비교해 봤다. 그 결과는 어느 쪽이든 끝났다. –

답변

1

숫자 문제 일 가능성이 큽니다. 따라서 0에 매우 가깝지만 0과 정확히 같지 않을 수 있습니다. 대신 while(fmod(bar,1.00) > 1e-10)을 사용해보십시오.

+0

정확한 배수를 찾는 것은 좋지 않습니다. –

+0

나는 이것을 시도했지만 끝내 무한 루프가 발생했습니다. 해결책은 위의 주석에서 발견되었지만 어쨌든 감사합니다! –