プロが教える店舗&オフィスのセキュリティ対策術

fprintf( fp, "%10.20f, %2.20f, %2.20f\n", b,c,d);
としてb,c,dの値を書きこもうとしました。


しかし、c,dの値が小さくて0になってしまいました。
どのように改善すればいいのですか?分かる方がいたら教えていただけないでしょうか?
よろしくお願いします。

ちなみにc,dの値は0.000000023などです。

A 回答 (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
    • good
    • 0
この回答へのお礼

OSはウインドウスXPです。
コンパイラーはVISUALSTUDIOのコマンドプロンプトです。

お礼日時:2011/04/19 21:06

floatで宣言しているからではないでしょうか?


doubleで宣言したら表示されませんか?

有効数字の桁数が足りないような気がします。
間違ってたらすみません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/04/19 21:08

e でも g でも使えばいいだけでは?

    • good
    • 0
この回答へのお礼

なるほど。

お礼日時:2011/04/19 21:07

これだけ見ると、特に0になる要因はありません。



フォーマットfで 10.20 / 2.20 と指定してあります。
前の数字は表示する最小の桁数(この「最小」が重要です。指定した桁で足りなければ、その分桁を増やします)
数点の後は、小数点以下に表示する桁数です。
%10.20fでは、小数点以下20桁、全体で最低10桁で表示する(実際には、小数点以下20桁+小数点+最低1桁の22桁以上になる)

なので、
> c,dの値は0.000000023
が本当なら、0にはなりません。

・値はどうやって確認したのでしょうか?
頭で考えたものなら、実際の計算とのずれがこかにあります。デバッガを使うとか、あちらこちらで%gで表示(%gは値によって指数表記になるので、%fで精度が足りない、などということはおきない)させるとかして、計算の流れを確認しましょう。
途中で整数同士のワリザンとか入ってませんか?
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/04/19 21:07

Cなんざ数年触ってませんし、確認もしてませんが記述がおかしいと思います



「%2.20f」の場合、小数箇所が20桁ですが、全体が2桁しかありません。


%全体桁数.少数桁数f と記述してみてください。
例えば、0.0000000231111・・・を「0.000000023」と表示させたい場合は

少数、9桁
小数点、1桁
整数、1桁(なくてもいいが)

で、%10.9f とすれば良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2011/04/19 16:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!