2012-04-20 120 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 2012-04-23 22:20:42

回答

3

單精度浮點數沒有足夠的精度來存儲(t.tv_sec) + (t.tv_usec/1000000)中的所有位。如果你等待足夠長的時間(約2分鐘),你會看到一個大的跳躍。

+0

天哪,你可以得到高爾夫酥油!這非常有趣,謝謝你的洞察力! – 2012-04-20 02:00:49