为什么这个浮点加法结果不正确?

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。你会得到想要的结果。

Live Demo

根据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);