2012-04-20 3 views
2

그래서 하루의 두 번째 시간을 얻을 수있는 방법이 필요했기 때문에 fmod() & gettimeofday() (Mac OSX)을 사용했습니다.C++ : fmodf() & fmod() - 이상한 결과?

#include <iostream> 

#include <sys/time.h> 
#include <cmath> 

class A { 
public: 
    static float secondOfDayFmodF() 
    { 
     timeval t; 
     gettimeofday(&t, NULL); 

     return fmodf((t.tv_sec) + (t.tv_usec/1000000.0), 86400); 
    } 

    static float secondOfDayFmod() 
    { 
     timeval t; 
     gettimeofday(&t, NULL); 

     return fmod(((t.tv_sec) + (t.tv_usec/1000000.0)), 86400); 
    } 
}; 

using namespace std; 

int main(int argc, const char *argv[]) 
{  
    for (int i = 0; i < 100; i++) 
    { 
     cout << "fmodf:\t" << A::secondOfDayFmodF() << endl; 
     cout << "fmod:\t" << A::secondOfDayFmod() << endl; 

     // sleep for 1 s 
     sleep(1); 
    } 

    getchar(); 
} 

출력 :

fmodf : 5760
FMOD : 5699.17
fmodf : 5760
FMOD : 5700.17
fmodf : 5760 그러나, 나는 길을 따라 몇 가지 이상한 결과에 와서
fmod : 5701.17
fmodf : 5760
fmod : 5702.17
fmodf : 5760
FMOD : 5703.17
fmodf : 5760
FMOD : 5704.17
fmodf : 5760
FMOD : 5705.18
...

그럼, 왜 fmodf() 버전 줘 않습니다 동일한 출력이 매번 fmod() 버전에서 예상되는 결과를 제공합니다 (sleep() 호출 이후 변경)? 문서에서 뭔가 빠졌습니까?

+1

[최신 공개적으로 사용 가능한 C++ 표준 초안] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf)을 참조하십시오. – pmg

답변

3

단 정밀도 부동 소수점은 모든 비트를 (t.tv_sec) + (t.tv_usec/1000000)에 저장할만큼 정밀도가 충분하지 않습니다. 충분히 길게 (약 2 분) 기다리면 큰 도약을 볼 수 있습니다.

+0

Gosh darn glye 너는 맞다! 매우 흥미 롭습니다. 통찰력에 감사드립니다! –