2

所以,我需要一种方法来获得当天的第二天,所以我搞砸了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 fmodf75.7 ...






那么,为什么fmodf()版本每次都给我相同的输出,而fmod()版本给出了预期的结果(sleep()调用后改变)?我在文档中遗漏了什么吗?

4

1 回答 1

3

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

于 2012-04-20T01:58:10.423 回答