[英]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.