2012-04-20 2 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 golie ghee whiz вы правы! Это очень интересно, спасибо за понимание! –

Смежные вопросы