我正在编写一个应用程序,其中我必须以毫秒为单位记录带有时间戳的接收数据。这是我的代码
struct timespec ts;
struct tm tt;
clock_gettime(CLOCK_REALTIME,&ts);
localtime_r(&ts.tv_sec,&tt);
double d=(tt.tm_hour*3600+tt.tm_min*60+tt.tm_sec)*1000.0+ts.tv_nsec/1000000.0;
float f1=(tt.tm_hour*3600+tt.tm_min*60+tt.tm_sec)*1000.0f+ts.tv_nsec/1000000.0f;
float f2=(tt.tm_hour*3600+tt.tm_min*60+tt.tm_sec)*1000.0f;
float f3=ts.tv_nsec/1000000.0f;
float f4=f2+f3;
printf("d=%lf\tf1=%f\tf2=%f\tf3=%f\tf4=%f\n",d,f1,f2,f3,f4);
这是打印的示例输出
d = 84137605.580233 f1 = 84137608.000000 f2 = 84137000.000000 f3 = 605.580200 f4 = 84137608.000000
但这里是双变量d和浮点变量f1&的输出。 f4是不同的。有人可以告诉我这个的原因。
答案 0 :(得分:1)
请注意,84137605是十六进制的0x503D685,因此需要27位才能以全精度表示它。 IEEE浮点数具有24位精度(23个小数位加一个隐藏位)。所以,你输了。