- ベストアンサー
fprintfで微小な数値を書き込む場合??
fprintf( fp, "%10.20f, %2.20f, %2.20f\n", b,c,d); としてb,c,dの値を書きこもうとしました。 しかし、c,dの値が小さくて0になってしまいました。 どのように改善すればいいのですか?分かる方がいたら教えていただけないでしょうか? よろしくお願いします。 ちなみにc,dの値は0.000000023などです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ご質問がすべて正しいとすると、コンパイラや実行環境が そういう仕様なのでは? OSやコンパイラには何をお使いでしょうか? ちなみに手元のCentos5.5+gcc4.1.2では正常に動作するようです。 [localhost tmp]$ cat test.c #include <stdio.h> int main(int argc, const char *argv[]) { float b,c,d; FILE *fp = fopen("output.txt", "w"); b = c = d = 0.000000023f; fprintf(fp, "%10.20f, %2.20f, %2.20f\n", b,c,d); fclose(fp); } [localhost tmp]$ ./test [localhost tmp]$ cat output.txt 0.00000002300000012667, 0.00000002300000012667, 0.00000002300000012667
その他の回答 (4)
- axel_eye
- ベストアンサー率64% (145/226)
floatで宣言しているからではないでしょうか? doubleで宣言したら表示されませんか? 有効数字の桁数が足りないような気がします。 間違ってたらすみません。
お礼
ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
e でも g でも使えばいいだけでは?
お礼
なるほど。
- kmee
- ベストアンサー率55% (1857/3366)
これだけ見ると、特に0になる要因はありません。 フォーマットfで 10.20 / 2.20 と指定してあります。 前の数字は表示する最小の桁数(この「最小」が重要です。指定した桁で足りなければ、その分桁を増やします) 数点の後は、小数点以下に表示する桁数です。 %10.20fでは、小数点以下20桁、全体で最低10桁で表示する(実際には、小数点以下20桁+小数点+最低1桁の22桁以上になる) なので、 > c,dの値は0.000000023 が本当なら、0にはなりません。 ・値はどうやって確認したのでしょうか? 頭で考えたものなら、実際の計算とのずれがこかにあります。デバッガを使うとか、あちらこちらで%gで表示(%gは値によって指数表記になるので、%fで精度が足りない、などということはおきない)させるとかして、計算の流れを確認しましょう。 途中で整数同士のワリザンとか入ってませんか?
お礼
ありがとうございます。
- mindatg
- ベストアンサー率48% (110/227)
Cなんざ数年触ってませんし、確認もしてませんが記述がおかしいと思います 「%2.20f」の場合、小数箇所が20桁ですが、全体が2桁しかありません。 %全体桁数.少数桁数f と記述してみてください。 例えば、0.0000000231111・・・を「0.000000023」と表示させたい場合は 少数、9桁 小数点、1桁 整数、1桁(なくてもいいが) で、%10.9f とすれば良いと思います。
お礼
ありがとうございました
お礼
OSはウインドウスXPです。 コンパイラーはVISUALSTUDIOのコマンドプロンプトです。