便携式浮点变量模板
Portable floating point variable templates
如何在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 将数字转换为双精度数,然后应用模板。我不认为 L
文字是答案,因为我不想在移动到 float128 或更高版本时重写。我怎样才能让编译器保留所有的精度?
所有浮点文字,除非另外加上后缀,都是double
类型。您将它用作 T
的初始值设定项(无论 T
可能是什么)都没关系,您仍将使用 double
转换为 a 来初始化 pi
T
.
用 l
后缀文字使其成为 long double
,然后将其转换为 T
。
如何在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 将数字转换为双精度数,然后应用模板。我不认为 L
文字是答案,因为我不想在移动到 float128 或更高版本时重写。我怎样才能让编译器保留所有的精度?
所有浮点文字,除非另外加上后缀,都是double
类型。您将它用作 T
的初始值设定项(无论 T
可能是什么)都没关系,您仍将使用 double
转换为 a 来初始化 pi
T
.
用 l
后缀文字使其成为 long double
,然后将其转换为 T
。