想用C语言编个小程序处理实验数据,power[i]数组中储存了递增的X轴点,ela[i]数组中储存了y轴数据点,现想通过线性插值计算给定点的数据,代码如下
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
//#include <fstream>
#define OVER_N 1000
void pass(FILE* fp, int min, int max)
{
char s[OVER_N];
int i;
fpos_t fpos;
fgetpos(fp, &fpos);
fgets(s, sizeof(s), fp);
for (i = min; i < max; i++)
{
fgetpos(fp, &fpos);
fgets(s, sizeof(s), fp);
}
fsetpos(fp, &fpos);
}
double* R_allocMem_1D_double(int _dim1)
{
double* _pointer = NULL;
if ((_pointer = (double*)calloc(_dim1, sizeof(double))) == NULL)
exit(30);
return _pointer;
}
int main()
{
FILE* fp, * fp1, * fp2, * fp3;
int i;
long double a;
long double bt;
long double be;
long double x1;
long double x2;
long double y1;
char str[40];
int powPoint;
int ii;
double* power;
double* bar;
double* abs;
double* ela;
char none[200];
printf("请输入生成的ACE文件名:");
scanf("%s", &str);
//printf("%s\n", str);
fp = fopen(str, "r");
if (fp == NULL)
{
printf("Open filefailure!");
exit(1);
}
pass(fp, 0, 6);
fscanf(fp, "%d", &ii); printf("ii = %d\n", ii);
fscanf(fp, "%s", none);
fscanf(fp, "%d", &powPoint); printf("%d\n", powPoint);
fscanf(fp, "%s", none);
fscanf(fp, "%s", none);
fscanf(fp, "%s", none);
fscanf(fp, "%s", none);
fscanf(fp, "%s", none);
pass(fp, 0, 6);
power = R_allocMem_1D_double(powPoint);
bar = R_allocMem_1D_double(powPoint);
abs = R_allocMem_1D_double(powPoint);
ela = R_allocMem_1D_double(powPoint);
for (i = 0; i < powPoint; i++)
{
fscanf(fp, "%lf", &power[i]);
//printf("-%20.11E\n", power[i]);
}
for (i = 0; i < powPoint; i++)
{
fscanf(fp, "%lf", &bar[i]);
}
for (i = 0; i < powPoint; i++)
{
fscanf(fp, "%lf", &abs[i]);
//printf("-%20.11E\n", power[i]);
}
for (i = 0; i < powPoint; i++)
{
fscanf(fp, "%lf", &ela[i]);
//printf("-%20.11E\n", power[i]);
}
fclose(fp);
printf("read ok\n");
fp1 = fopen("gra-en", "w");
fp2 = fopen("gra-tol", "w");
for (a = 0.00001; a < 20; a = a + 0.00001)
{
i = 1;
while (a > power[i])
{
i++;
}
x1 = power[i] - power[i - 1];
x2 = a - power[i - 1];
y1 = bar[i] - bar[i - 1];
bt = x2 * y1 / x1 + bar[i - 1];
fprintf(fp1, "%-20.11E\n", a); printf("-%20.11E\n", a);
fprintf(fp2, "%-20.11E\n", bt);
}
fclose(fp1);
fclose(fp2);
fp3 = fopen("gra-ela", "w");
for (a = 0.00001; a < 20; a = a + 0.00001)
{
i = 1;
while (a > power[i])
{
i++;
}
x1 = power[i] - power[i - 1];
x2 = a - power[i - 1];
y1 = ela[i] - ela[i - 1];
be = x2 * y1 / x1 + ela[i - 1];
fprintf(fp3, "%-20.11E\n", be); printf("-%20.11E\n", a);
}
fclose(fp3);
printf("finished\n");
system("pause");
}
目前程序可以运行,但是a值在4.60058后出现问题,与设定的以0.00001递增不符
4.60049000000E+00
4.60050000000E+00
4.60051000000E+00
4.60052000000E+00
4.60053000000E+00
4.60054000000E+00
4.60055000000E+00
4.60056000000E+00
4.60057000000E+00
4.60058000000E+00
4.60058999999E+00
4.60059999999E+00
4.60060999999E+00
4.60061999999E+00
4.60062999999E+00
尝试更换过数据类型,无论double a和long double a都会出错
希望各位老哥帮忙解释一下出现问题的原因以及如何解决问题,谢谢