3

printf の %g 形式と %f 形式でゼロ パディングが異なる理由を理解したいと思います。サンプルプログラムは次のとおりです。

#include <stdio.h>
int main()
{
  double d = 0.10000000000001;
  printf("%04.2f\n", d);
  printf("%04.2g\n", d);
  return 0;
}

出力します

0.10
00.1

これは、Windows の VC++ と Linux の gcc の両方で再現可能です。

なぜこのように機能するのですか?それは正しい行動ですか?

更新:答えは見つかりましたが、質問を開いたままにすると思います...

4

3 に答える 3

3

正解です。gC99 7.19.6.1/8のスタイルの仕様によると:

#フラグを使用しない限り、結果の小数部分から末尾のゼロが削除され、小数部分が残っていない場合は小数点文字が削除されます。

一方、stylefは、後続のゼロが削除されることを指定していません。

于 2013-02-28T14:13:11.203 に答える
1

%g を使用する場合、printf は、最小の場所で最高の精度を与える形式を選択します。d = 0.10500000 の場合は "00.1" が出力され、d = 0.10500001 の場合は "0.11" が出力されることがわかっているため、精度の評価方法を推測できます。

于 2013-02-28T14:13:51.620 に答える
0

std::cout オブジェクトの同名のメンバー関数によって、幅と精度を制御できます。

http://en.cppreference.com/w/cpp/io/basic_ostreamのドキュメントから precision は浮動小数点演算の 10 進精度を管理します (std::ios_base のパブリック メンバ関数) width はフィールド幅を管理します (std:: のパブリック メンバ関数) ios_base)

于 2013-02-28T13:44:12.803 に答える