を変更する前に精度を取得し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) ...