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で質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q数値に E でてくるのは。

Microsoft Excel や MATLABを使って数値計算をしているのですが、数値が非常に小さくなる時に、Eの入った形で表示されるのですが、これは大体いくつくらいを意味しているのでしょうか。
下にExcel計算の結果を載せておきます。よろしくお願いします。

.......
........
0.017946166
0.006095256
0.001997971
0.000645368
0.000207253
6.64089E-05
2.12612E-05
6.80477E-06
2.17766E-06
6.96868E-07
2.23E-07
......
...

Aベストアンサー

 E以下の数値は10の指数部を表します。

http://splab.spo.fukuoka-u.ac.jp/exlfaq/

 つまり、

 E-05=10^(-5)=0.00001
 E-06=10^(-6)=0.000001
 ・・・

と云うことです。
 6.64089E-05 の場合は、

 6.64089×0.0001=0.0000664089

となります。

Qprintf,fprintfって・・・

こんにちは。
お恥ずかしいのですが、printfとfprintfの相違点は何でしょうか?
初心者にも分かるよう解説お願いします。

Aベストアンサー

printfは画面に文字や数値を表示させます。
fprintfはファイルに文字や数字を書き込ませます。

Q大きすぎる数値になるとE+になってしまいます…。

プログラミング上、どうしても馬鹿でかい数値を扱うことがあり、どうしても正規な数値ではなくE+といった形になってしまいます。
何か対処法はないでしょうか?

Aベストアンサー

がると申します。
「馬鹿でかい数値」のサイズにもよるのですが、ある程度以上(signed long値を超えるような数値。具体的には2147483647を超えるような値)の場合には注意を払う必要があります。
こういった数値を扱う場合、PHPですと、GMP関数やBCMath任意精度数学関数といったものを用いる必要があります。

Q%fと%gについて

C初心者です。入門書を読んでいて疑問に思ったので質問です。

floating point typeの数値をprintfで表示するとき
たとえばfloat PI=31.415と宣言していたなら
%eとするとアウトプットは3.1415e+01となり、
%Eとすると3.1415E+01となるのは分かるんです。

ただ、%fと%g、%gと%Gでコンパイルしたときのそれぞれの違いが
%fと%gでは桁数が違うくらいしか分からなかったし、
%gと%Gでは何が違うのか全く見当がつきません。

もしご存知の方いたら、教えてくださいm(_ _)m

Aベストアンサー

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html より

g,G
double 引き数を f か e (G 変換の場合は F か E) の形式に変換する。精度は表示する桁数を指定する。精度が指定されない場合は、6桁とみなされる。精度が 0 の場合は、1桁とみなされる。変換される値の指数が、 -4 より小さいか、精度以上の場合に、 e 形式が使用される。変換された結果の小数部分の末尾の 0 は削除される。小数点が表示されるのは、小数点以下に数字が少なくとも一つある場合にだけである。

QE列のセルに数値が入れば(空白でなければ)B列の同じ行のセルに色がつく

E列のセルに数値が入れば(空白でなければ)B列の同じ行のセルに色がつくようにしたい。

エクセル2007です。
条件付き書式で、数値を入れたセル自体に色をつけることはできたのですが他の列を参照することができませんでした。

どうやって設定すればいいでしょうか。

Aベストアンサー

B1セルの条件付書式で、条件を
「数式が」「=ISBLANK(E1)=FALSE」
とすればよいです。

Q数値計算の高速化 (cos, sin, exp)

数値計算の計算コストに関しての質問です。

webなどで見ていると、「cos, sin, expは計算コストが
高く、高速化のために、他の計算方法で代用できる
場合は代用する」ということが書かれていたのを見ました。

cosやsinの計算にテイラー展開したもので代用する方が
計算が早くなるということでしょうか?

Aベストアンサー

★乗算はテーブルにすると早い。
・2桁の『乗算』を『*』演算子で計算するよりも、10×10 のテーブルを
 用意して、テーブル参照させると高速になります。また、1桁の参照も
 別の1桁テーブル参照をさせると高速になります。→組み合わせる。
・このようにテーブルを用意して、固定小数点(整数値)で計算させると
 高速になります。→『多倍長演算』と呼び、マクローリン展開でどこ
 まで計算結果に精度を求めるかです。
・『マクローリン展開』でも収束するまで計算させるのではなく、回数を
 指定して 3~4 で強制的に計算を終了すれば高速になります。
・収束は倍・倍に精度がよくなるため、3~4 回の計算でも結構よい精度
 になりそうです。→試してみましょう。

最後に:
・よく使う数は、『定数』としてテーブルに保存して計算させると高速化
 できます。→『マクローリン展開』で利用する『階乗』など。(1!~6!)
・あと、実数値を多倍長の整数値で表現して、あとで小数点と桁数の丸め
 込みなどを行えば高速になります。→実数よりも整数が高速だから。
・『多倍長演算』で検索するといろいろ出てきます。
・以上。おわり。参考になりましたか?

リンク:
・http://yosshy.sansu.org/maclaurin.htm
・http://assam.cims.hokudai.ac.jp/~josch/workshop/math/Maclaurin/Maclaurin1.htm
・http://www.sist.ac.jp/~suganuma/kougi/other_lecture/SE/math/diff/diff.htm

参考URL:http://www5.airnet.ne.jp/tomy/cpro/longint.htm

★乗算はテーブルにすると早い。
・2桁の『乗算』を『*』演算子で計算するよりも、10×10 のテーブルを
 用意して、テーブル参照させると高速になります。また、1桁の参照も
 別の1桁テーブル参照をさせると高速になります。→組み合わせる。
・このようにテーブルを用意して、固定小数点(整数値)で計算させると
 高速になります。→『多倍長演算』と呼び、マクローリン展開でどこ
 まで計算結果に精度を求めるかです。
・『マクローリン展開』でも収束するまで計算させるのではなく、回数を
 指定して 3...続きを読む

Q長い数値を入力すると「1.23457E+17」と表示されてしまうのは?

長い数値で例えば「123456789123456789」を入力すると「1.23457E+17」とセル内には表示され、データとしては「123456789123456000」となり、入力したものとあきらかに異なっています。
これはどういうことなのでしょうか?
また、正しく「123456789123456789」と表示させるにはどうしたらいいのでしょうか?

よろしくお願いします。

Aベストアンサー

#2です。
「ただ、10のXX乗は別の箱に入っているので......
について、ご参考になるかわかりませんが書きます。
あなたは、対数をご存じですか ? その考え方を思い出して下さい。
a)5桁の電卓で99,999以上の数字を入れようとしても入りませんよね。
b)0.0001以下の数字でも同じように0となってしまいますね。
限られた桁数で、出来るだけ広い範囲の数値を表すためには実際の数値(0.0001)を、有効桁数内で表現できるように位取りをして(1)、実際の数値を、その値と10の指数乗(10の-4乗)の積で保存しています。
この指数乗の部分を別の箱と書きました。
計算機では、「浮動小数点表示」などと呼ばれているハズ。

Q1,1,2,3,5,8,13の合計

初心者ですみませんが、1,1,2,3,5,8,13の合計を出すプログラミングがどうしてもわかりません。どなたかご教示頂けましたら助かります。
宜しくお願いいたします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
   printf("%d\n", 1+1+2+3+5+8+13);
}

Qdocomo/LGのL-03Eで電池残量を数値確認

こんばんは

L-03Eを購入して使い始めましたが困ったことがあります。
電池残量を 90% などのような数値で確認する方法がわかりません。

乾電池をもしたようなおなじみのアイコンで大まかな残量は確認できますが、具体的な数値での確認をしたいのです。Connection Managerにログインしても同様の項目はありませんでした。以前に使っていたバッファローのルーターはログインすると数値で確認できたのですが。

取説もさらってみましたが該当する項目は見つけられませんでした。
ご存じの方がいらっしゃったら教えてください。

Aベストアンサー

どうやら、説明書を見ても記載がありませんから、その表示の設定はないと思われます。

QC++でfprintfやprintf,fopenなどを使うのは好ましくない?

今までCは多少慣れがあり、一方でC++はごく最近始めました。
CとC++でパッと見明らかに違うのが入出力の関数とストリームだと思うのですが
どうも私的にはCで使いっていたfprintfなどが使いやすいと思ってしまいます。
実数の表示の小数点以下の桁の指定とか、fprintf("xxxx%.3f")としたほうが
ラクチンではないでしょうか?

ただEffective C++などを見た感じC++ではC++のやり方のほうが良い
とか書いてあってやはりそういうもんなのかなぁと。
それなら多少C++の利便性を切り捨ててでもCでやるかなぁと
思ってしまうのですが。。。

アドバイスいただけたら幸いです。お願いいたします。

Aベストアンサー

C++で printf() などを使うのは一概に悪いというわけではありません。
最低限、混在して使わなければ、まずはOKです。
ただ、ひとつ考えて欲しいのは、

> fprintf("xxxx%.3f") としたほうが楽

なのは、単に、これまでCで使い慣れていたからという理由に過ぎません。本質的にそちらの方が楽というわけではないのです。

一方で、printf() 系列の問題点というのは、可変引数関数なので、引数の型判定が実行時にしかわからないという点があります。
int i;
printf("%f", i);
などとして、表示がおかしいのに悩んだりするのはよくあることです。
また、決定的なこととして、C++では、クラスという「自前の型(ちょっと違う)」を作ることができます。これは、printf() では直接扱うことができません。
しかし、

class myClass;
// 適切に << を定義する
myClass aInstance;
int i;
cout << aInstance << " → " << i << "\n";
のように、C++流のストリームを使えば、それらも統一的に扱うことができます。
また、引数の型が異なっても適切に処理されます。

このようなことを含めて、C++のパワーを使うには、C++の流儀が良いということです。

C++で printf() などを使うのは一概に悪いというわけではありません。
最低限、混在して使わなければ、まずはOKです。
ただ、ひとつ考えて欲しいのは、

> fprintf("xxxx%.3f") としたほうが楽

なのは、単に、これまでCで使い慣れていたからという理由に過ぎません。本質的にそちらの方が楽というわけではないのです。

一方で、printf() 系列の問題点というのは、可変引数関数なので、引数の型判定が実行時にしかわからないという点があります。
int i;
printf("%f", i);
などとして、表示がおか...続きを読む


人気Q&Aランキング

おすすめ情報