我的程序从该文件中读取数据:
6 150
0 1.75
30 0.8
60 0.5
70 1
120 0.1
140 0.9
并将这些数字(从第二行开始)插入到结构数组中,然后计算“时间”。结果很好,但一个;第三个('时间')是100,但输出是99.999992。
以下是该计划:
#include <stdio.h>
#include <stdlib.h>
int di,i,k,m;
float vi,time;
int n;
int l;
struct node
{
int distance;
float velocity;
}DV[500000];
struct timeslist_node
{
struct timeslist_node *left;
int winner;
int loser;
double time;
struct timelist_node *right;
};
double calctime(int d,float v);
void print_array();
main()
{
FILE *fp;
fp=fopen("candidates.txt","r");
if (fp==NULL) exit(2);
fscanf(fp,"%d %d",&n,&l);
printf("%d,%d\n",n,l);
for(i=0;i<n;i++)
{
fscanf(fp,"%d %f",&DV[i].distance,&DV[i].velocity);
}
calctime(DV[i].distance,DV[i].velocity);
print_array();
fclose(fp);
system("pause");
}
double calctime(int d,float v)
{
for(i=0;i<n;i++)
{
if (i == 0)
{
{
if (DV[n-1].velocity==DV[i].velocity)
time=-1;
}
time=((l-DV[n-1].distance)/(DV[n-1].velocity-DV[i].velocity));
m=1;
k=n;
}
else
{
{ if (DV[i-1].velocity==DV[i].velocity)
time=-1;
}
time=((DV[i].distance-DV[i-1].distance)/(DV[i-1].velocity-DV[i].velocity));
k=i;
m=i+1;
}
printf ("t %d %d=%lf\n",m,k,time);
}
}
void print_array()
{
for(i=0;i<n;i++)
printf("D[%d],V[%d] = %d %.2f\n ",i,i,DV[i].distance,DV[i].velocity );
}
答案 0 :(得分:1)
这是因为浮点数的精度有限。如果您想知道原因,请深入了解浮点数如何存储在内存中。 http://en.m.wikipedia.org/wiki/Floating_point
答案 1 :(得分:0)
典型的float
将按预期处理数学,但仅限于一定的范围和精度。
该精度通常约为6,可能是7,有效数字。请参阅FLT_DIG
中的<float.h>
。 99.999992
是将数字打印到8位有效数字的结果。使用printf("%.5e", some_float)
会将输出限制为其实际精度。
使用double
而不是float
通常会提供额外的范围和精度。但是同样的问题也会发生,尽管数字更加极端。
正如许多其他人所说的那样,许多问题导致总和被打印为99.999992
而不是100.0
。
首先,总和很可能是99.99999237060546875
,这是前一个float
,假定为binary32,为100.0
。将99.99999237060546875
之类的数字打印到8个重要位置正在超出C中float
的合理精度预期。"%f"
打印小数点后6位数的数字。由于该数字为99.99999237060546875
,因此打印了一个四舍五入的99.999992
,其中包含2 + 6位有效数字。
第二:各种数学运算都有不准确的结果。预计会1.0/3.0
,但100 + 0.1
也会出现这种情况。这个想法在经典参考文献中概述每个计算机科学家应该知道的浮点运算
第3,回想浮点数不是线性的,而是以对数方式分布。 1.0到10.0之间的数字大约在10.0和100.0之间。
答案 2 :(得分:-2)