установить точность по умолчанию C++

Я хочу контролировать точность для double во время сравнения, а затем вернуться к точности по умолчанию, с C++.

Я намерен использовать setPrecision() установить точность. Что такое синтаксис, если он есть, чтобы вернуть точность по умолчанию?

я делаю что-то вроде этого

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

я делаю некоторые вещи, и я хотел бы вернуться к двойному сравнению по умолчанию сразу после этого.

Я изменил вот так, и у меня все еще есть некоторые ошибки

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

С cmath - значение false при компиляции, и std::ios_base также false при компиляции. Не могли бы вы помочь?

спасибо.

3 ответов


вы можете получить точность до вы измените его, с 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

код выше показывает два способа установки точности, сначала вызывая std::cout.precision (N) и во-вторых, используя манипулятор потока std::setprecision(N).


но нужно иметь в виду, что точность для вывод значения через потоки, это непосредственно не влияет на сравнение самих значений с кодом, таким как:

if (val1== val2) ...

другими словами, хотя выход может быть 3.14159 само значение остается полное 3.141592653590 (при условии нормальных ограничений с плавающей запятой, конечно).

если вы хотите это сделать, вам нужно будет проверить, достаточно ли близко, а не равно, с кодом, таким как:

if ((fabs (val1 - val2) < 0.0001) ...

вам нужно отслеживать текущий precison, а затем сбросить обратно к тому же, как только сделано с вашими операциями с требуемым измененным precison. Для этого вы можете использовать std::ios_base:: precision:

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

первый синтаксис возвращает значение текущего поля точности с плавающей запятой для потока.
Второй синтаксис также устанавливает новое значение.


setprecision () может использоваться только для выходных операций и не может использоваться для сравнения

чтобы сравнить поплавки, скажем a и b, вы должны сделать это явно следующим образом:

  if( abs(a-b) < 1e-6) {   
  }
  else {
  }