C - time () в time.h обновляет свое значение каждые 128 секунд - PullRequest
1 голос
/ 29 марта 2020

Я написал простой код для проверки функции time() из time.h:

// time-test.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    float now = (float)time(NULL);
    fprintf(stdout, "time() returns: %f\n", now);

    return 0;
}

Но когда я запускаю этот код, я обнаружил, что time() только «обновляет» его значение каждые 128 секунд. Так что мой вывод похож на

user@ubuntu:~/workspace$ gcc -o time-test time-test.c
user@ubuntu:~/workspace$ ./time-test
time() returns: 1585473408.000000
user@ubuntu:~/workspace$ ./time-test
time() returns: 1585473408.000000
user@ubuntu:~/workspace$ ./time-test
time() returns: 1585473408.000000

А потом немного позже,

user@ubuntu:~/workspace$ ./time-test
time() returns: 1585473408.000000
user@ubuntu:~/workspace$ ./time-test
time() returns: 1585473536.000000

Если вы проверите, вы можете увидеть, что значения, которые time() Возвращает также кратные 128. Я думаю, что это может быть операционная система, которая делает это нарочно, но я не уверен.

Есть ли способ обновить значения каждую 1 секунду? Любая помощь или pu sh в правильном направлении будет принята с благодарностью!

PS Я использую Ubuntu 18.04 на Windows с VMWare Workstation Pro.

1 Ответ

4 голосов
/ 29 марта 2020

В системах POSIX (например, Linux или macOS) функция time возвращает количество секунд, прошедшее с полуночи 1 января 1970 года. Теперь это число значительно превышает один миллиард (и быстро приближается к 2, где число со знаком 32). -битное целое число не сможет с этим справиться, проблема Y2k38 ).

Точность типа с плавающей запятой одинарной точности (что и есть float) просто недостаточно хорош для обработки таких больших чисел с такой высокой точностью или разрешением.

Используйте либо тип с плавающей запятой двойной точности (например, double), либо правильный time_t целочисленный тип.

...