Проблема с вашим кодом в том, что:
Вы используете flaot
для представления результата time()
, который представляет собой большое целое число и может привести к неточности преобразования из-за природы значений с плавающей запятой.
Точность функции time()
хороша только с точностью до секунды, поэтому ваш код никогда не будет работать в течение 2,5 секунд, но всегда будет работать в течение 3 секунд, так как вы можете продолжить только с шагом в 1 секунду .
Чтобы решить эту проблему, не используя плавающее значение (что не имеет смысла, так как большинство функций, работающих со временем, используют интегральные значения), вы можете использовать функцию gettimeofday()
в Linux, или GetSystemTime()
, если вы работаете в Windows.
Linux:
#include <stdio.h>
#include <sys/time.h>
unsigned long long get_time(void) {
struct timeval time;
gettimeofday(&time, NULL);
return time.tv_sec * 1000 * 1000 + time.tv_usec;
}
int main(int argc, char* argv[]) {
unsigned long long timeout = get_time() + 2500000;
// Accurate to the microsecond.
// 2.5 s == 2 500 000 us
while(get_time() < timeout) {
printf("Hello World\n");
}
return 0;
}
Windows
#include <stdio.h>
#include <windows.h>
unsigned long long get_time(void) {
SYSTEMTIME time;
GetSystemTime(&time);
return time.wSecond * 1000 + time.wMilliseconds;
}
int main(int argc, char* argv[]) {
unsigned long long timeout = get_time() + 2500;
// Accurate to the millisecond.
// 2.5 s == 2 500 ms
while(get_time() < timeout) {
printf("Hello World\n");
}
return 0;
}
ПРИМЕЧАНИЕ , что в Windows точность снижается до миллисекунды, а в Linux - до микросекунды.