如何在c++14中定义可移植的高精度浮点型变量模板?下面的程序应该以 double
和 long 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/