Подскажите, как задать точность вывода float/double числа через printf?
У меня сейчас вывод выглядит следующим образом:
printf("a: %20.16f, b: %20.16f, c: %20.16f", a, b, c);
и настроен под точность double, но иногда я использую float числа (для ускорения расчётов) и тогда мне нужна float точность без вывода дополнительных чисел
Как корректнее реализовать выбор соответствующей точность? Есть варианты
1) определять тип данных и для каждого типа использовать свой вариант вывода
template<class T>
void myprint()
{
if (typeid(T) == typeid(float))
printf("a: %10.6f, b: %10.6f, c: %10.6f", a, b, c);
else
printf("a: %20.16f, b: %20.16f, c: %20.16f", a, b, c);
}
2) формировать строку в зависимости от точности
const int prec = std::numeric_limits<T>::digits10 + 1;
const std::string format = "%" + std::to_string(4 + prec) + "." + std::to_string(prec);
...
оба варианта с недостатками (во втором как-то приходится правильно сформировать строку $x.y, что требует относительно много кода для такой задачи, а в первом варианте слишком много if придется наставить)
как можно оптимальнее разрешить эту проблему?
Вашу задачу можно решить с помощью специализации шаблона:
//общий шаблон из которого будет инстанцироваться float
template<class T>
void myprint()
{
printf("a: %10.6f, b: %10.6f, c: %10.6f", a, b, c);
}
//специализация для double
template<>
void myprint<double>()
{
printf("a: %20.16f, b: %20.16f, c: %20.16f", a, b, c);
}
Также замечу, что printf - это функция языка Си, рекомендую воспользоваться функционалом языка C++:
#include <iostream>
#include <iomanip>
template<class T>
void myprint()
{
std::cout << std::fixed
<< "a: " << std::setw(10) << std::setprecision(6) << a << ", "
<< "b: " << std::setw(10) << std::setprecision(6) << b << ", "
<< "c: " << std::setw(10) << std::setprecision(6) << c;
}
template<>
void myprint<double>()
{
std::cout << std::fixed
<< "a: " << std::setw(20) << std::setprecision(16) << a << ", "
<< "b: " << std::setw(20) << std::setprecision(16) << b << ", "
<< "c: " << std::setw(20) << std::setprecision(16) << c;
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости