2016-03-19 46 views
0

しばらくの間サーフィンしても、この問題について明確な説明が見つかりませんでした。たぶん、誰でも私がそれがなぜうまくいくのかを明らかにすることができます。小数点以下の桁数とprintf()の桁数、fprintf()の書式%gと%fの比較

いくつかのコードでは、doubleの数値をfprintf(ファイルストリームを適切に初期化した後)でファイルに保存しています。先験的に、私は私のプログラムに何が渡されたのか、とくにそのフォーマットがどのようなものなのか分かりません。 0.000111.1e-4の比較では、%.5fの代わりにフォーマット指定子%.5gを使用すると思いました。ここでは、データを5桁の10進精度で保存します。

しかし、それはそうでない場合は例えばのように、ではない、数字は0に等しい整数部分を持っている場合%gで私の保存された数値の小数精度が正確であることが判明:

FILE *fp; 
fp = fopen("mydata.dat","w+"); //Neglecting error check for brevity 
double value[2] = {0.00011,1.00011}; 
printf("\ng-format\n"); 
for(int i=0;i<2;i++){ 
    frintf(fp,"%.5g\n",value[i]); 
    printf("%.5g\n",value[i]); 
} 
printf("\n\nf-format\n"); 
for(int i=0;i<2;i++){ 
    frintf(fp,"%.5f\n",value[i]); 
    printf"%.5f\n",value[i]); 
} 
fclose(fp); 

これは、生産次の出力は(とstdストリーム上)ファイルに:

だから、
g-format 
0.00011 
1.0001 

f-format 
0.00011 
1.00011 

は、なぜ%gの選択は、整数部がゼロでないとすぐに小数点以下の桁を「食べて」されますか?

+0

**%6g **は6桁の有効数字を意味し、先頭の0はsigとみなされません。図**%6f **は常に小数点以下6桁を意味します。 –

+0

説明をお寄せいただきありがとうございます。マニュアルのキーワードは「有効数字」です! – maurizio

答えて

0

最初の桁から%g印字x桁が0ではない したがって、x + 1桁が整数部分にない場合は、丸めます。 x + 1桁が整数部分にある場合は、数字を科学記号で表示します(丸めすぎても)

%fは整数部分とx桁を表示します。

1

小数点を入力していません。 %gでは、フィールド幅は有効桁数を指定します。 1.0001には5桁の有効数字があり、これは "%.5g"の呼び出しです。これはフィールド幅が小数点以下の桁数を指定する%fとは異なります。

+0

清算していただきありがとうございます。あなたとSpouarkの回答はどちらも明確です。私は彼がポイントを得るのを助けるためにSpouarkのものを承認するでしょう。 – maurizio

0

OPの高い問題と思われるものを答えるために:

私は5桁の10進精度で自分のデータを保存したいです。コード6つの総有効数字で値を保存する必要がある場合

、非ゼロ主要桁と指数表記で小数点以下5ヶ所ですべての値*を出力れる.5eを使用します。 "%g"で気にしないでください。

*もちろん、0.0の値は、先行するゼロ以外の数字で印刷されません。

関連する問題