2012-04-20 14 views
2

だから、私は今日の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

ゴッシュダンゴリーあなたは正しいですか?それは非常に面白いです、洞察力に感謝します! –