1

一部のライブラリを変更しようとしていますが、float 値を ptree に格納する必要があります。ただし、値を取得すると、そこに入力した値とは異なります。これはダブルスでは起こりません。例:

Ptree pt;

float f = 230518.391;
pt.put("float", f);
pt.put("double", (double) f)

cout << "f: " << f;
cout << "pt.float: " << pt.get<float>("float");
cout << "pt.double: " << pt.get<double>("double");

出力: f: 230518.391 pt.float: 230518.406 pt.double: 230518.391

ここで一体何が起こっているのですか?

4

2 に答える 2

2

おそらく、丸めの「エラー」とコンパイラの最適化の組み合わせ..丸めは、浮動小数点数がプロパティ ツリーに格納されるときに発生します..

ただし、 double を格納すると、丸めは行われません。この行pt.put("double", (double) f)で、コンパイラは「f」を最適化し、そこにリテラルを配置する可能性があります。したがって、コンパイラは丸められた値を使用しません。最初の cout も同様です。cout << "f: " << f;ここでも、float が最適化されて取り除かれ、リテラルがその場所に配置されます。

編集: テストしたところ、「丸められた」値が実際には「230518.9 06」である可能性があります

このサイトは、これらの数値の変換に役立つ場合があります:)。

于 2012-01-26T15:57:20.397 に答える
1

floatあなたはそれをいくらか7桁の周りに制限された精度として考慮する必要があります。したがって、表示されているのは、リテラルに最も近い格納可能なfloat値である可能性があります。その場合、他の出力は、正しい値を取得するためのコンパイラーの最適化の影響を受ける可能性があります(コンパイラーはf、doubleへの変換を省略し、リテラルを配置するだけで済みます。

于 2012-01-26T16:00:47.163 に答える