6

C++ での浮動小数点数表示の表示に関するいくつかのトピックを読みましたが、満足のいく答えが見つかりませんでした。

私の質問は: C++ で浮動小数点数のすべての有効数字を科学的形式 (仮数/指数) で表示する方法は?

問題は、10 進数の有効桁数がすべての数値で同じではないことです。

たとえば、 adouble15 ~ 17桁の有効な 10 進数の精度を持ちますが、std::numeric_limits<double>::digits1015 を返すため、一部の数値では精度が 2 桁余分に失われます。

4

3 に答える 3

5

この値std::numeric_limits<double>::digits10は、安全に復元できる 10 進数の桁数、つまり、10 進数 -> ->10 進数の往復で生き残る 10 進数の桁数を提供しますdouble。より多くの 10 進数が正しいと仮定しても役に立ちません。往復を容易にしたい場合は、double->10 進数->doubleを使用しますstd::numeric_limits<double>::max_digits10

使用する正確な値が必要な場合でも、std::numeric_limits<double>::digits通常は丸められた値であるため、10 進数値から変換された数値が面白い方法で表示されます。これは、人間が消費する数値を提示するときに が役に立たない理由でもありmax_digits10ます。通常、最後の数桁は、人間の読み手が期待するものではありません。

于 2013-10-26T18:45:04.077 に答える
2

あなたは見ましたstd::max_digits10か?

cppreferenceから:

の値は、テキストへのシリアライゼーション/デシリアライゼーションに必要な場合などstd::numeric_limits<T>::max_digits10、 type のすべての個別の値を一意に表すために必要な 10 進数の数字です。Tこの定数は、すべての浮動小数点型で意味があります。

これが意味すること (そして私がそれを使用する方法) は、テキスト出力を別のプログラムにコピー/貼り付けすることができ、数値が同じ数値を表すことです。

ここで、私の主力フォーマットは常に右寄せ%23.16Eであり、最後の数桁については工学的判断を使用していると言わざるを得ません。符号、指数、16 桁で十分なため、気に入っています。

-----------------------
-1.1234567812345678E+12

digitsここで、精度とdecimal digits精度は必ずしも同じではないことに注意してください。

于 2013-10-26T18:25:32.503 に答える