C语言数据计算过程出错

想用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都会出错

希望各位老哥帮忙解释一下出现问题的原因以及如何解决问题,谢谢