便携式浮点变量模板

Portable floating point variable templates

如何在c++14中定义可移植的高精度浮点型变量模板?下面的程序应该以 doublelong double 精度打印 pi。

#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 或更高版本时重写。我怎样才能让编译器保留所有的精度?

所有浮点文字,除非另外加上后缀,都是double类型。您将它用作 T 的初始值设定项(无论 T 可能是什么)都没关系,您仍将使用 double 转换为 a 来初始化 pi T.

l 后缀文字使其成为 long double,然后将其转换为 T