/*
* 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 с точностью до миллисекунды?
float
имеет от 6 до 9 десятичных цифр точности.
Поэтому, если целочисленная часть равна, например, 1,391,432,494 (время UNIX, когда я пишу это, требуя 10 цифр), вы уже не указали цифры для дробной части. Не так хорошо, и именно поэтому float
для этого не удается.
Прыгая в двойное, вы получаете 15 цифр, поэтому, кажется, хватит до тех пор, пока вы можете предположить, что целочисленная часть является отметкой времени UNIX, то есть секундами с 1970 года, поскольку это означает, что в скором времени она вряд ли сможет использовать значительно большее количество цифр.
Кажется, что 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() и сравнивал его с текущим временем, чтобы получить продолжительность.