0

たとえば、「0.10」などの 10 進数値を格納する文字列があります。これをフロートに変換したい。しかし、atof を使用してそれを行うと、得られる数値は本来あるべき値ではありません。私は、10 進数値の数値計算を含むいくつかの複雑なアルゴリズムを作成しているため、最終的な結果が失われています。

これは、私が抱えている問題を説明する簡単なコードです。ここでは、10 進数値を文字列に入れ、atof で float に変換し、cout で出力するだけです。私が得ている結果は、atof が小さな 10 進数を最終値に追加していることを示しています。

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

int main()
{
    string value = "0.10";
    float valueAsFloat = atof(value.c_str());

    cout.precision(20);
    cout << valueAsFloat << endl;

    return 0;
}

出力は次のとおりです。

0.10000000149011611938

何か案は?Ubuntu で GNU g++ コンパイラを使用しています。問題を引き起こしているのは、このコンパイラのバグでしょうか? もしそうなら、値をフロートに変換して正しい値を取得する他の方法はありますか? ありがとう。

編集:その質問は、なぜこれが起こるのかについて部分的な説明を提供しますが、それは完全な価値を与えるものではなく、機能する場合と機能しない場合がある単一のソリューションのみを提供します. したがって、この質問を別の質問として開いておくことは有効だと思います。

4

1 に答える 1

1

これは変換アクティビティの問題ではなく、float 固有の精度 (または精度の欠如) の問題です。コンパイラが異なれば、精度も異なります。また、1 つの出力が次の入力となる連続した数学的演算を実行するにつれて、精度はさらに低下します。精度の欠如は、バイナリ (離散) データを使用して連続実数セットの値を概算することに起因します。

代わりに「double」を使用することもできます。伝統的に、浮動小数点数の 2 倍の精度があります。ただし、最新のコンパイラの中には、「double」に float と同じ精度を使用するものがあります。

この問題は、別のコンパイラや別のデータ型を選択することで軽減できますが、最終的な問題は残ります。

于 2014-05-29T21:33:57.503 に答える