为什么这个浮点加法结果不正确?
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()
的 return 值以确保成功。
编辑:
正如其他人所指出的,失去精度的主要原因是由于使用了 float
类型。 中很好地解释了,将变量类型更改为 double
将提高精度,并且您将获得细粒度的结果,正如您所期望的那样。
如果想要更精确,请将 float
更改为 double
double time, sec;
并在 sscanf
中使用 %lf
。你会得到想要的结果。
根据IEEE 754编码,很多数字都会有细微的变化,使它们成为stored.Also,有效数字的位数可以稍微改变,因为它是二进制表示,而不是十进制.
单精度(浮点数) 为您提供 23 位 有效数、8 位指数和 1 位符号位。
双精度(双精度) 为您提供 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);
我正在尝试计算 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()
的 return 值以确保成功。
编辑:
正如其他人所指出的,失去精度的主要原因是由于使用了 float
类型。 double
将提高精度,并且您将获得细粒度的结果,正如您所期望的那样。
如果想要更精确,请将 float
更改为 double
double time, sec;
并在 sscanf
中使用 %lf
。你会得到想要的结果。
根据IEEE 754编码,很多数字都会有细微的变化,使它们成为stored.Also,有效数字的位数可以稍微改变,因为它是二进制表示,而不是十进制.
单精度(浮点数) 为您提供 23 位 有效数、8 位指数和 1 位符号位。
双精度(双精度) 为您提供 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);