しばらくの間サーフィンしても、この問題について明確な説明が見つかりませんでした。たぶん、誰でも私がそれがなぜうまくいくのかを明らかにすることができます。小数点以下の桁数とprintf()の桁数、fprintf()の書式%gと%fの比較
いくつかのコードでは、double
の数値をfprintf
(ファイルストリームを適切に初期化した後)でファイルに保存しています。先験的に、私は私のプログラムに何が渡されたのか、とくにそのフォーマットがどのようなものなのか分かりません。 0.00011
と1.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
の選択は、整数部がゼロでないとすぐに小数点以下の桁を「食べて」されますか?
**%6g **は6桁の有効数字を意味し、先頭の0はsigとみなされません。図**%6f **は常に小数点以下6桁を意味します。 –
説明をお寄せいただきありがとうございます。マニュアルのキーワードは「有効数字」です! – maurizio