2016-12-15 7 views
0

私はCSVファイルをスキャンしようとしています。 ここにコードがあります。sscanfの何が問題になっていますか?

FILE *fp; 
    float pts[1000][2]; 
    char line[1000]; 
    int n = 0; 
    fp = fopen("abc.csv","r"); 
    n = 0; 
    while(fgets(line, sizeof line, fp)) 
    { 
     sscanf(line,"%f,%f",&pts[n][0],&pts[n][1]); 
     n++; 
    } 
    for(i=0;i<n;i++) 
     printf("%f, %f\n",pts[i][0],pts[i][1]); 

仮定するabc.csvは

11.654000, 22.332001 
11.654000, 22.332001 
11.654000, 22.332001 

はどこ余分0.000001から来ているのですか?、私は印刷すると、私のように出力を得る

11.654,22.332 
11.654,22.332 
11.654,22.332 

が含まれていますか

何か助けていただければ幸いです。前もって感謝します。

+0

にそれを設定することができますか? – sameerkn

+0

@sameerknはい、私は実際にはいくつかのポイントのx座標とy座標をスキャンしています。したがって、%.3fは、それが異なる可能性があるため、正確には私が望むものではありません。 – lU5er

答えて

5

scanfとは関係ありません。これは、floatがメモリに表現/格納されているためです。

は、以下のことを試してみてください。

float x = 22.332; 
printf("%f\n", x); 

あなたが結果は同じであることがわかります。

ルックがで:https://softwareengineering.stackexchange.com/questions/101163/what-causes-floating-point-rounding-errors

+0

それでは、どうすれば22.332が正確に得られますか? – lU5er

+0

@Apy: '%3f、%.3f \ n"、pts [i] [0]、pts [i] [1]); ' – sameerkn

+2

GNU MPFRのような任意の精度の' decimal'ライブラリを使用してください。それが過度なことでない場合。 –

1

浮動小数点数は、IEEE-754(シングルまたはダブル)などの規格にメモリに格納され、これらの基準は、彼らが浮動小数点ているので、あなたが期待するすべての浮動小数点数を表すことができませんでした。浮動小数点ストレージの精度は一定ではないため、格納できる最も近い数に数値を切り上げようとします。

また、printfと%fのデフォルトの精度は6である、あなたはそれらの浮動小数点値を使用したくない、 `フロートvariable`に値を読んだ後3

printf("%.3f, %.3f\n",pts[i][0],pts[i][1]); 
関連する問題