【发布时间】:2015-07-29 08:22:21
【问题描述】:
如何在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 或更高版本时我不想重写。如何让编译器保持所有精度?
【问题讨论】:
-
便携镜腿?祭坛可能是个问题。
-
它是可移植的,因为它是浮动的。 :)