web-dev-qa-db-ja.com

Cの%gと%fの違いは何ですか?

私はK&RのCプログラミング言語を試していました。ここで、二重変数を出力するステートメントに書かれています

printf("\t%g\n", sum += atof(line));

sumはdoubleとして宣言されます。ダブルまたはフロートの場合に%gを使用する場合、%gと%fの違いを教えてください。

25
Shashi Bhushan

manページ などのリファレンスマニュアルを参照してください。

f、F

Double引数は丸められ、[-] ddd.dddスタイルの10進表記に変換されます。ここで、小数点文字の後の桁数は精度の指定と等しくなります。精度が欠落している場合、6と見なされます。精度が明示的にゼロの場合、小数点文字は表示されません。小数点が表示される場合、その前に少なくとも1桁が表示されます。 (SUSv2はFを知らず、無限大およびNaNの文字列表現が利用可能になると述べています。C99標準では、無限大に「[-] inf」または「[-] infinity」、および「nan 'NaN(f変換の場合)、および[[-] INF'または '[-] INFINITY'または 'NAN *'(F変換の場合)。)

g、G

Double引数は、スタイルfまたはe(またはG変換の場合はFまたはE)に変換されます。精度は、有効桁数を指定します。精度が欠落している場合、6桁が与えられます。精度がゼロの場合、1として扱われます。変換の指数が-4未満または精度以上の場合、スタイルeが使用されます。結果の小数部分から末尾のゼロが削除されます。小数点の後には、少なくとも1つの数字が続く場合にのみ表示されます。

26
unwind

どちらも浮動小数点入出力の例です。

%gと%Gは、科学表記法の浮動小数点数%eと%Eの簡略化子です。

%gは、%f(単純なfloatまたはdouble)または%e(科学表記法)として表すことができる数値を取り、2つの短い方として返します。

Printステートメントの出力は、sumの値に依存します。

35
Daniel Nill

Unwindが指摘しているように、fとgは異なるデフォルト出力を提供します。

大まかに言えば、小数点の後に来るものの詳細に関心がある場合はfを使用し、大きな数値をスケーリングする場合はgを使用します。いくつかのほこりだらけの記憶から、すべてが揃ったままの数字のテーブルを印刷する場合、小さな値でfは非常にいいですが、数字の変化が大きくなりレイアウトが重要な場合はgのようなものが必要です。 eは、数字が非常に小さいか非常に大きい傾向があるが、決して10に近くない場合に便利です。

別の方法は、毎回同じ数の文字を表す文字を取得するように出力形式を指定することです。

ひどい答えは申し訳ありませんが、生成された文字数が重要な場合、または表現された値の精度が高い場合にのみ難しい答えを得るのは主観的な出力です。

3
TafT