Подскажите, как задать точность вывода 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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Требуется скопировать файл из одной папки в другуюСделать это было решено через функцию "fileCopy()"
Я новичок в Андроиде , и во время разработки у меня возникла проблема с сохранением AndroidSpinner при повороте єкрана
Всем привет, я новичок в AndroidУ меня есть два Spinner и в зависимости от выбора переходим к действию
Мне нужно полученное RGB значение пикселя отнести к 7 основным цветам, каким образом это сделать на Java?