Переносимые шаблоны переменных с плавающей точкой

Как определить переносимые высокоточные шаблоны переменных с плавающей точкой в ​​C++14? Программа ниже должна печатать пи с double а также long double точность.

#include <iostream>
#include <iomanip>
#include <limits>

template<typename T>
constexpr T pi = T(3.141592653589793238462643383279502884197);


int main() {
  std::cout << std::setprecision(std::numeric_limits<double>::max_digits10) << pi<double> << std::endl;
  std::cout << std::setprecision(std::numeric_limits<long double>::max_digits10) << pi<long double> << std::endl;
}

Когда я компилирую с GCC 5.1.0 g++ -std=c++14 я получил

3.1415926535897931
3.141592653589793116

Я предполагаю, что gcc преобразует число в двойное, а затем применяет шаблон. Я не думаю, что L ответ буквальный, потому что я не хочу переписывать при переходе на float128 или выше. Как я могу заставить компилятор сохранять всю точность?

1 ответ

Решение

Все литералы с плавающей точкой, если не указано иное, имеют тип double, Что вы используете его в качестве инициализатора для T (без разницы T может быть) не имеет значения, вы все еще собираетесь инициализировать pi с double преобразован в T,

Суффикс буквальный с l сделать это long double, который затем преобразуется в T,

Другие вопросы по тегам