[英]Why is this floating point addition result not correct?
我正在尝试以微秒为单位计算buffer
中的时间。
但是我不明白为什么我的代码的浮点运算结果不正确。
float time, sec;
int h, m;
sscanf(16:41:48.757996, "%d:%d:%f", &h, &m, &sec);
printf("buffer %s\n",buffer);
printf("hour %d\n",h);
printf("minute %d\n",m);
printf("seconde %f\n",sec);
time=3600*h+60*m;+sec;
printf("%f\n",time);
执行此代码时,将得到以下结果:
buffer 16:41:48.757996
heure 16
minute 41
seconde 48.757996
60108.757812
但我期望:
buffer 16:41:48.757996
heure 16
minute 41
seconde 48.757996
60108.757996
浮点运算的结果不正确。
我认为,您的代码中有一个小的错字。 更改
time=3600*h+60*m;+sec;
至
time=3600*h+60*m+sec; // remove ; from the apparent middle of the statement
^^
否则, sec
值变得基本上是无用的。
也就是说,请始终检查sscanf()
的返回值以确保成功。
编辑:
正如其他人指出的那样,失去精度的主要原因是使用float
类型。 在此答案中很好地解释了,将变量类型更改为double
可以提高精度,并且您将得到预期的细粒度结果。
根据IEEE 754编码,许多数字会有很小的变化以允许存储它们;此外,有效数字的数量可能会略有变化,因为它是二进制表示形式,而不是十进制表示形式。
单精度(浮点数)为您提供23位有效数,8位指数和1个符号位。
双精度(double)为您提供52位有效数,11位指数和1个符号位。
以下代码段将为您工作
#include<stdio.h>
#include <stdlib.h>
int main()
{
double time, sec; // changed to double
double h, m;
sscanf("16:41:48.757996", "%lf:%lf:%lf", &h, &m, &sec);
printf("hour %lf\n",h);
printf("minute %lf\n",m);
printf("seconde %lf\n",sec);
time=3600*h+60*m+sec;
printf("%lf\n",time);
}
双打计算很好!
double time, sec;
sscanf(buffer, "%d:%d:%lf", &h, &m, &sec);
printf("buffer %s\n",buffer);
printf("heure %d\n",h);
printf("minute %d\n",m);
printf("seconde %f\n",sec);
P.TempsEmission=3600*h+60*m+sec;
printf("%lf\n",P.TempsEmission);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.