c++ - 可移植浮点变量模板

标签 c++ gcc c++14

如何在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 将数字转换为 double ,然后应用模板。我不认为 L 文字是答案,因为我不想在移动到 float128 或更高版本时重写。我怎样才能让编译器保持所有的精度?

最佳答案

所有浮点字面量,除非另外加上后缀,都是double类型。您将它用作 T 的初始化程序(无论 T 可能是什么)都没关系,您仍然要初始化 pi double 转换为 T

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

关于c++ - 可移植浮点变量模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31695041/

相关文章:

c - 字符串末尾的随机字符

c++ - 是否可以测试 constexpr 函数是否在编译时求值?

c++ - 在模板基类列表中使用类局部类型别名

c++ - 二维数组指针不适用于两个维度

c++ - 生成球面弧坐标

c++ - Obj 文件中已经定义的函数

c++ - 仅在头文件中静态模板化成员函数的模板行为

c++ - 位域变量语法

c - 如何使用共享库中的方法

c - 使用 graphviz 作为库的问题