3

以前の質問で、キャストや変換を行わずにdoubleとintを比較すると、 2つのdoubleの違いがどのように比較をトリップしているかがわかりました。

setprecision()メソッドに出くわしました。これは、小数点以下のすべての数値を表示するのに役立ちます。

したがって、6.15と3.15の違いは次のようになります:3.00000000000000044408920985006

ここで、3と比較すると、3より大きいという結果が返されます。

限られた桁数だけを取るように強制するにはどうすればよいですか?

6.1と3.1を使用した場合、違いは2.999999999999999955591079014994でした。

実際に3に等しく、それ以上であることがわかるように、精度をどのように作成すればよいですか。

4

5 に答える 5

4

うまくいけば、floating / doubleを2進数で正確に表すことはできず、循環小数のために切り捨てが発生することを知っておく必要があります。整数のfloat/doubleとの比較は常に失敗します。

setprecisionを使用しても、保存されている値ではなく、表示の精度を設定するiomanipの方法であるため、機能しません。

doubleを比較する移植可能な方法は、'=='演算子を使用するのではなく、次のようなことを行うことです。

bool Compare(double a,double b) {
    std::fabs(a - b) < std::numeric_limits<double>::epsilon();
}

これを使用して、doubleをfloatまたはintegerと比較できます。floatの同様の比較関数を作成することもできます

bool Compare(float a,float b) {
    std::fabs(a - b) < std::numeric_limits<float>::epsilon();
}
于 2012-05-02T19:41:37.337 に答える
3

他の質問へのコメントで、あなたはすでに浮動小数点数に関するこの素晴らしい論文に向けられていました。読む価値は十分にあります。

あなたの特定の質問に関して、標準的な方法は、double間の比較が行われる許容値を定義することです。たとえば、2つのdoubleaと、があり、 (別のdouble)の許容範囲内よりも大きいbかどうかを判断したい場合は、次のようにします。abeps

if (a - b > eps) {
  // a is greater than b
} else {
  // a is not greater than b
}

あるいは、それがで指定された許容範囲内にa等しいことを知りたい場合は、次のようなことを行うことができます。beps

if (std::abs(a - b) <= eps) {
  // a and b are equal within the set tolerance
} else {
  // a and b are not equal within the set tolerance
}

他の人が指摘しているように、C ++には、この種の比較を実行するための便利な関数がいくつか付属しています。std :: absstd :: neuro_limits、およびSOに関するこの素晴らしい投稿を見てください。

于 2012-05-02T19:45:59.523 に答える
2

これは、2つの数値が互いに1つのLSB内にあるかどうかを判断する比較関数です。

bool Compare(double a, double b)
{
    return (a <= std::nextafter(b, abs(1.1*b))) && (b <= std::nextafter(a, abs(1.1*a)));
}

std::nextafterはC++11の新機能ですが、バージョンは以前のコンパイラで使用できます。ビットをいじることなく、次に大きいまたは最小の表現可能な浮動小数点数を生成するを参照してください。

于 2012-05-02T19:51:23.673 に答える
1

setprecisionストリームに吐き出す桁数を選択できます。考慮する桁数は決定しません。丸めの目的で、からの丸め関数の1つを使用し<cmath>ます。

于 2012-05-02T19:39:52.340 に答える
0

floatとdoubleの精度の桁数は、実際にはそれぞれのサイズによって異なります。そのため、floatの精度は一般にdoubleよりも低くなります。使用できます

    std::cout<<std::setprecision(desired no);

    float a=(desired no);

これで、floatの精度が正常に設定されました。同じことが、doubleを含む他の適切なデータ型にも実行できます。 警告は、データ型が提供する精度よりも高い精度を設定しないでください。Doubleの精度は15〜18桁ですが、floatの精度は6〜9桁です。

于 2017-05-31T06:59:56.483 に答える