28

比較中にdoubleの精度を制御してから、C++を使用してデフォルトの精度に戻したいと思います。

setPrecision()精度を設定するために使用するつもりです。精度をデフォルトに戻すための構文がある場合、それは何ですか?

私はこのようなことをしています

std::setPrecision(math.log10(m_FTOL));

私はいくつかのことをします、そして私はすぐにデフォルトの二重比較に戻りたいです。

このように変更しましたが、まだエラーがあります

std::streamsize prec = std::ios_base::precision();
std::setprecision(cmath::log10(m_FTOL));

cmathコンパイル時にfalse、コンパイル時にfalse std::ios_base。手伝ってくれる?

4

5 に答える 5

38

を変更するに精度を取得しstd::ios_base::precision、それを使用して後で元に戻すことができます。

これを実際に見ることができます:

#include <ios>
#include <iostream>
#include <iomanip>

int main (void) {
    double d = 3.141592653589;
    std::streamsize ss = std::cout.precision();
    std::cout << "Initial precision = " << ss << '\n';

    std::cout << "Value = " << d << '\n';

    std::cout.precision (10);
    std::cout << "Longer value = " << d << '\n';

    std::cout.precision (ss);
    std::cout << "Original value = " << d << '\n';

    std::cout << "Longer and original value = "
        << std::setprecision(10) << d << ' '
        << std::setprecision(ss) << d << '\n';

    std::cout << "Original value = " << d << '\n';

    return 0;
}

出力:

Initial precision = 6
Value = 3.14159
Longer value = 3.141592654
Original value = 3.14159
Longer and original value = 3.141592654 3.14159
Original value = 3.14159

上記のコードは、精度を設定する2つの方法を示しています。1つは呼び出しによる方法、もう1つstd::cout.precision (N)はストリームマニピュレーターを使用した方法ですstd::setprecision(N)


ただし、精度はストリームを介して値を出力するためのものであり、値自体と次のようなコードとの比較には直接影響しないことに注意する必要があります。

if (val1== val2) ...

つまり、出力がである場合3.14159でも、値自体はまだ完全です3.141592653590(もちろん、通常の浮動小数点の制限が適用されます)。

それを実行したい場合は、次のようなコードを使用して、等しいというよりも十分に近いかどうかを確認する必要があります。

if ((fabs (val1 - val2) < 0.0001) ...
于 2012-09-24T07:10:12.947 に答える
5

現在の精度を追跡し、必要な変更された精度で操作を行った後、同じ精度にリセットする必要があります。これには、 std :: ios_base::precisionを使用できます。

streamsize precision ( ) const;
streamsize precision ( streamsize prec );

最初の構文は、ストリームの現在の浮動小数点精度フィールドの値を返します。
2番目の構文も、新しい値に設定します。

于 2012-09-24T07:11:14.947 に答える
3

setprecision()は出力操作にのみ使用でき、比較には使用できません

aとbのフロートを比較するには、次のように明示的に行う必要があります。

  if( abs(a-b) < 1e-6) {   
  }
  else {
  } 
于 2012-09-24T07:12:48.263 に答える