C ++:fmodf()& fmod() - 奇怪的结果?

时间:2012-04-20 01:40:42

标签: c++ posix modulo gettimeofday

所以,我需要一种方法来获得当天的第二天,所以我搞砸了fmod()& gettimeofday()(Mac OSX)。但是,我在这个过程中遇到了一些奇怪的结果:

#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 个答案:

答案 0 :(得分:3)

单精度浮点数的精度不足以存储(t.tv_sec) + (t.tv_usec / 1000000)中的所有位。如果你等待足够长的时间(约2分钟),你会看到一个大跳跃。