簡體   English   中英

為什么此浮點加法結果不正確?

[英]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);
}

如果需要更高的精度,請將float更改為double

double time, sec;   

並在sscanf使用%lf 您會得到理想的結果。

現場演示

雙打計算很好!

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM