-2

フロートを印刷するための最良の方法はありますか (私は long double を使用しています)? いくつかの方法を試しましたが、すべてのタイプの数値に対して機能するものはないようです。

説明しましょう。

3 つの print ステートメントがあります。

print(M_PI); // from cmath
print(1.234);
print(1.234e-10);

以下は、print(const long double &n) のいくつかの実装の結果です。

シンプルなCOUT

cout << n << endl;

3.14159 // not good
1.234 // good
1.234e-10 // good

正確に計算する

cout.precision(numeric_limits<long double>::digits10);
cout << n << endl;

3.14159265358979312 // good
1.23399999999999999 // bad
1.23400000000000008e-10 // not good

固定精度で計算する

cout.precision(numeric_limits<long double>::digits10);
cout << fixed << n << endl;

3.141592653589793116 // good
1.233999999999999986 // bad
0.000000000123400000 // not good

固定の代わりに「科学的」を使用する可能性は他にもいくつかありますが、それは明らかに望ましくありません。

4

3 に答える 3

1

次のような printf または sprintf を使用できます。

float p1 = 1.234;
float p2 = 1.234e-10;
float p3 = M_PI;

printf("%.5g - %.5g - %.5g", p1, p2, p3);

出力:

1,234 - 1,234e-10 - 3,1416
于 2013-03-28T10:54:20.310 に答える
1

問題は、一部の 10 進数が 2 進数で正確に表現できないことです。の正確な 10 進数表現がないのと同様に、 ( としても知られる)1.0 / 3.0の正確な 2進数表現はありません。1.0 / 10.00.1

そのため、コンピューターの場合、10 進数で「自然な表現」または「可能な限り多くの桁数」という明確な概念はありません。

コードを入力0.1すると、実際にはメモリ内の最も近いバイナリ値で表されます。この 2 進数値を 10 進数に戻すと (これは常に正確に可能です)、次の結果が得られます。0.1000000000000000055511151231257827021181583404541015625

于 2013-03-28T10:47:05.337 に答える
-1

ストリームを好きなように変更して出力するメソッドを実装する

ios_base& myway (ios_base& str){

}
于 2013-03-28T10:28:47.547 に答える