0

データを失うことなく文字列を浮動小数点数に変換しようとしています。たとえば、 istringstream または ::atof(x.c_str()) を使用すると、丸めのためにデータが失われると思います。

通常、これは私にとって問題ではありませんが、読み取りと同じでなければならないデータを使用しています。数値とその変換結果の例を次に示します。

-8.000001 -> -8
-0.6257381 -> -0.625738
12.0 -> 12 (drops the .0) 

誰かが私を助けることができれば、私はとても感謝しています

ありがとうマット

4

3 に答える 3

5

あなたの質問には 3 つの潜在的な問題があります。

  1. 表示される精度の量。使用する精度を制御するには#include <iomanip>、 を使用して、使用std::cout << std::setprecision(17);する桁数を設定します。

  2. フォーマット。「12.0」に「12.0」が欲しい場合、「.0」はfloatやに格納されないので注意が必要doubleです。にはdouble値 12 が含まれています。元の精度やエラー間隔に関する情報は含まれていません。それはちょうど 12 であり、他には何もありません。特定の方法でフォーマットする場合は、I/O ストリームのフォーマット フラグを使用するか、独自のコードを記述してフォーマットを行う必要があります。

  3. 正確さ。commonfloatdoubleタイプは、8.000001 または 0.6257381 を正確に表すことはできません。2 進数を使用して浮動小数点値を表し、10 進数を 2 進数に変換するとわずかなエラーが発生します。浮動小数点を非常に単純に使用し、floatおよびの制限よりも大幅に少ない桁数で作業しているdouble場合は、これを無視して、限られた桁数で数値を単純にフォーマットすることができます。単純なケースを超えると、エラー分析を行う必要があり、これは非常に複雑になる可能性があります。

于 2013-06-24T14:07:02.647 に答える
1

別のデータ型が必要になります。

浮動小数点の 10 進数型を使用すると、数値を正確に格納できます。このような型では、数値は科学表記法のようにペア (仮数、指数) として格納され、IEEE 2 進浮動小数点数とよく似ています。

あなたの例は次のように保存されます

(-8000001, -6)
(-6257381, -7)
(120, -1)

たとえば、医療機器の通信に関する ISO 11073 規格では、このような形式が使用されています。

欠点は、すべての浮動小数点演算ハードウェアが基数 2 の指数を使用して数値を処理するように設計されているため、演算が非常に遅くなることです。

于 2013-06-24T14:13:05.580 に答える
0

経験則として、afloatは有効数字 6 桁までしか正確ではありません。したがって、文字列にそれ以上の桁数がある場合、精度の制限に達します。

Adoubleは、驚くことではありませんが、この精度の約 2 倍を提供します。つまり、有効数字 12 桁です。

詳細については、浮動小数点型の有効桁数を参照してください。

于 2013-06-24T13:46:41.827 に答える