【发布时间】:2014-06-10 09:21:21
【问题描述】:
我的程序从那个文件中读取数据:
6 150
0 1.75
30 0.8
60 0.5
70 1
120 0.1
140 0.9
并将这些数字(从第二行开始)插入到结构数组中,然后计算“时间”。结果很好,但只有一个;第三个('time')是 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 );
}
【问题讨论】:
-
我很确定这归结为
float的精度有限。 -
程序应该做的:(60-30)/(0.8-0.5) 怎么接近浮点数的极限?
-
好吧,一方面,因为0.80 doesn't have perfect representation in IEEE 754 floating point。阅读 Dirk 链接的文章(是的,它很长,但你会在余生中牢牢记住它)。
-
还有一系列blog posts by Eric Lippert 比我链接的另一篇文章的数学要少。