c++: задать точность числа при выводе через printf

148
02 октября 2019, 23:00

Подскажите, как задать точность вывода 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 придется наставить)

как можно оптимальнее разрешить эту проблему?

Answer 1

Вашу задачу можно решить с помощью специализации шаблона:

//общий шаблон из которого будет инстанцироваться 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;
}     
READ ALSO
Скопировать файл из одной папки в другую

Скопировать файл из одной папки в другую

Требуется скопировать файл из одной папки в другуюСделать это было решено через функцию "fileCopy()"

109
Как сохранить SpinnerAdapter при повороте экрана?

Как сохранить SpinnerAdapter при повороте экрана?

Я новичок в Андроиде , и во время разработки у меня возникла проблема с сохранением AndroidSpinner при повороте єкрана

162
Как считать значение Spinner за пределами onItemSelected?

Как считать значение Spinner за пределами onItemSelected?

Всем привет, я новичок в AndroidУ меня есть два Spinner и в зависимости от выбора переходим к действию

108
Как отнести RGB значение к 7 основным цветам?

Как отнести RGB значение к 7 основным цветам?

Мне нужно полученное RGB значение пикселя отнести к 7 основным цветам, каким образом это сделать на Java?

173