Вернуть значение по умолчанию С++
Я хочу контролировать точность для double во время сравнения, а затем вернуться к стандартной точности с помощью С++.
Я намерен использовать 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 при компиляции. Не могли бы вы помочь?
Спасибо.
Ответы
Ответ 1
Вы можете получить точность перед тем, как изменить ее, с помощью 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) ...
Ответ 2
Вам нужно отслеживать текущую точность, а затем reset вернуться к тому же, как только это было сделано с вашими действиями с требуемым измененным критерием. Для этого вы можете использовать std:: ios_base:: precision:
streamsize precision ( ) const;
streamsize precision ( streamsize prec );
Первый синтаксис возвращает значение текущего поля точности с плавающей запятой для потока.
Второй синтаксис также устанавливает его в новое значение.
Ответ 3
setprecision() может использоваться только для операций вывода и не может использоваться для сравнения
Чтобы сравнить float, скажем a и b, вы должны сделать это явно следующим образом:
if( abs(a-b) < 1e-6) {
}
else {
}
Ответ 4
Сохраните все состояние с помощью std::ios::copyfmt
Вы также можете восстановить все предыдущее состояние с помощью std::ios::copyfmt
в этих ситуациях, как описано в: Восстановить состояние std :: cout после его манипулирования
main.cpp
#include <iomanip>
#include <iostream>
int main() {
constexpr float pi = 3.14159265359;
constexpr float e = 2.71828182846;
// Sanity check default print.
std::cout << pi << std::endl;
std::cout << e << std::endl;
// Change precision and restore default afterwards.
std::ios cout_state(nullptr);
cout_state.copyfmt(std::cout);
std::cout << std::setprecision(10);
std::cout << pi << std::endl;
std::cout << e << std::endl;
std::cout.copyfmt(cout_state);
// Check that cout state was restored.
std::cout << pi << std::endl;
std::cout << e << std::endl;
}
Скомпилировать и запустить:
g++ -o main.out -std=c++11 main.cpp
./main.out
Выход:
3.14159
2.71828
3.141592741
2.718281746
3.14159
2.71828
Протестировано на Ubuntu 16.04, GCC 6.4.0.
Ответ 5
Вы можете использовать cout << setprecision(-1)