C ++ gettimeofday () возвращает то же значение

0
/*
 * Returns time in s.usec
 */
float mtime()
{
    struct timeval stime;
    gettimeofday(&stime,0x0);
    return (float)stime.tv_sec+((float)stime.tv_usec)/1000000000;
}

main(){
    while(true){
        cout<<setprecision(15)<<mtime()<<endl;
        // shows the same time irregularly for some reason and can mess up triggers
        usleep(500000);
    }
}

Почему он показывает одно и то же время нерегулярно? (скомпилировано на ubuntu 64bit и C++) Какие другие стандартные методы доступны для создания метки времени unix с точностью до миллисекунды?

Теги:
time
gettimeofday

2 ответа

3
Лучший ответ

float имеет от 6 до 9 десятичных цифр точности.

Поэтому, если целочисленная часть равна, например, 1,391,432,494 (время UNIX, когда я пишу это, требуя 10 цифр), вы уже не указали цифры для дробной части. Не так хорошо, и именно поэтому float для этого не удается.

Прыгая в двойное, вы получаете 15 цифр, поэтому, кажется, хватит до тех пор, пока вы можете предположить, что целочисленная часть является отметкой времени UNIX, то есть секундами с 1970 года, поскольку это означает, что в скором времени она вряд ли сможет использовать значительно большее количество цифр.

  • 0
    Таким образом, это означает, что 1,391,432,494 будет рассматриваться как 1,391,432,49? или это будет петля с самого начала? Из моего эксперимента, кажется, остается заблокированным более 10 секунд.
  • 1
    Нет, более высокая точность целого числа будет "отображаться" на меньший набор представимых чисел в float, в основном. Вот почему число с плавающей запятой не меняется, пока целое число не переместилось достаточно далеко, чтобы его представление с плавающей запятой упало на новый номер, так сказать.
Показать ещё 2 комментария
0

Кажется, что float не имеет достаточной точности, заменен на двойной, и теперь все в порядке.

/*
 * Returns time in s.usec
 */
double mtime()
{
    struct timeval stime;
    gettimeofday(&stime,0x0);
    return (double)stime.tv_sec+((double)stime.tv_usec)/1000000000;
}

Все еще не совсем понимаю причину случайного поведения... PS. Я собирал mtime() и сравнивал его с текущим временем, чтобы получить продолжительность.

  • 0
    Я использую при возврате :). Что касается того, почему не возвращаться в программу в микросекундах, я также использую time () для менее точных измерений, и у меня есть переменные параметров во всей программе, которые установлены на секунды, и умножение их всех на 1000000 могло бы вызвать проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню