浮点加法无法正常工作

时间:2017-10-23 18:00:35

标签: c

我正在编写一个应用程序,其中我必须以毫秒为单位记录带有时间戳的接收数据。这是我的代码

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是不同的。有人可以告诉我这个的原因。

1 个答案:

答案 0 :(得分:1)

请注意,84137605是十六进制的0x503D685,因此需要27位才能以全精度表示它。 IEEE浮点数具有24位精度(23个小数位加一个隐藏位)。所以,你输了。