C 浮点加法无法正常工作
我正在编写一个应用程序,其中我必须以毫秒为单位记录接收到的数据。这是我的密码C 浮点加法无法正常工作,c,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
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的输出是不同的。有人能告诉我原因吗。注意84137605是十六进制的0x503D685,因此需要27位来表示它的全精度。IEEE浮点数有24位精度23分数位加上一个隐藏位。所以,你输了。这听起来像是一个标准的精度损失问题,因为浮点数和双精度不能精确地表示所有实数。答案很简单,浮点数的精度只有7-8位小数。你远远超过了这一点。这里不推荐使用浮点逻辑,而是考虑使用定点表示。此外,更高级别目标的替代方案是:将时间累积为整数(毫秒),并将打印时间累积为双精度。长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长时长。。。printft%0.3f\n,t\u ms/1000.0;