1

のような多数のファイルがあり、-7.47004e-16を使用してフロート配列に読み込もうとしています。

fscanf(rhs, "%f", &numbers[i]);" 

これはwhileループにあります。ただし、上記のような番号がある場合は機能しません。

数が多いのでうまくいきませんか?または、これは数値形式の「e」の機能しない原因ですか?

これを適切に行うためのいくつかの方法をお勧めしますか?

ありがとう。

注:Numbersはfloat配列であり、rhsはファイル名です。ファイルには1行に1つの番号があり、一部の番号は上記と同じ形式であり、一部の番号は、などのはるかに小さいもの-1.88493です。

コードは次のとおりです。

int main( int argc, char *argv[])
{
    FILE *rhs, *output;
    int niter, n, n1;
    // counters
    int i = 0, j = 0, k, m, p;

    rhs = fopen(argv[1], "r");
    // ab+ opens file for writting and creates the file if need be
    output = fopen(argv[2], "ab+");
    niter = atoi(argv[3]);

    // check if files open up or not, if not exit.
    if((rhs == NULL) || (output == NULL))
    {
        printf("Error Opening files.\n");
        exit(1);
    }

    // read in N
    fscanf(rhs, "%d", &n);

    // initialize n1
    n1 = n + 1;

    // generate array to hold values from rhs file
    long double *numbers = (long double *)malloc(sizeof(long double) * ((n1)*(n1)));
    long double *y = (long double *)malloc(sizeof(long double) * ((n1)*(n1)));
    long double *f = (long double *)malloc(sizeof(long double) * ((n1)*(n1)));
    long double *yp = (long double *)malloc(sizeof(long double) * ((n1)*(n1)));

    // get numbers and store into array
    for(i = 0; i <= n; i++)
    {
        for(j = 0; j <= n; j++)
        {
            fscanf(rhs, "%Lf", &numbers[i]);
            printf("i = %d, number = %Lf\n", i, numbers[i]);
        }
    }

    for(k = 0; k < niter; k++)
    {
        smooth(n, y, yp, f);
    }

    fclose(rhs);
    free(numbers);
    free(y);
    free(f);
    free(yp);

    return 0;

}

4

3 に答える 3

5

SSCCE (短い自己完結型の正しい例)

#include <stdio.h>

int main(void)
{
    FILE *rhs = stdin;
    int i = 0;
    float numbers[2];

    if (fscanf(rhs, "%f", &numbers[i]) != 1)
        printf("Failed to convert anything\n");
    else
        printf("Got: %13.6e\n", numbers[i]);
    return 0;
}

実行例:

$ ./flt
-7.47004e-16
Got: -7.470040e-16
$

このコードは、変換が成功したことを確認することに注意してください。あなたは常にそれを行うべきであり、正しいテストは示されているとおりです — 成功した変換の正しい数を取得しましたか. EOF にならずに変換に失敗する可能性があるため、EOF に対するテストは正しくありません。

于 2013-03-19T09:58:46.187 に答える
1

その特定の数値は、IEEE754単精度浮動小数点数には大きすぎないため、問題ないはずです。

double範囲と精度を追加するためだけに自分自身を使用しますが、それは個人的な好みです。

私が明確にしておきたいことの1つは、それrhsがファイル名であると述べたことです。私はそれが本当にから返されたファイルハンドルであることを望んでいますfopen、さもなければそれは大きな問題を伴うでしょう:-)

さらに、ファイルごとではなく、行ごとに1つの番号があることを意味していると思います。

例として、次のトランスクリプトを参照してください。このトランスクリプトは、入力ファイル、Cプログラムの使用fscanf、および出力を示しており、このメソッドが正常に機能することを確認しています。

pax> cat qq.in
    -7.47004e-16
    3.14159
    2.718281828459
    42

pax> cat qq.c
    #include <stdio.h>
    #include <math.h>

    int main (void) {
        float f;
        FILE *fin = fopen ("qq.in", "r");
        while (fscanf (fin, "%f", &f) == 1)
            printf ("    %f %e\n", f, f);
        fclose (fin);
        return 0;
    }

pax> ./qq
    -0.000000 -7.470040e-16
    3.141590 3.141590e+00
    2.718282 2.718282e+00
    42.000000 4.200000e+01
于 2013-03-19T09:51:50.793 に答える
0

2e−126最大、約を表すことができるので、 float のサイズ制限ではないと思います1.18 *10e−38。印刷時に float の精度を指定しなかった可能性がありますか?

次のように印刷してみてください。

printf("%.30f\n", f);
于 2013-03-19T09:55:21.773 に答える