根据维基百科,不同精度数据类型的布局是
我写了一个小程序来输出 C++ 中float、double和long double的数值限制(用 g++ 编译)
#include<iostream>
#include<limits>
#include<string>
template<typename T>
void print(std::string name) {
std::cout << name << " (" << sizeof(T) * 8 << "): " << std::numeric_limits<T>::epsilon() << "\t" << std::numeric_limits<T>::min() << "\t" << std::numeric_limits<T>::max() << std::endl;
}
int main() {
std::cout.precision(5);
print<float>("float");
print<double>("double");
print<long double>("long double");
return 0;
}
哪些输出(我已经在多台机器上运行它,结果相同)
float (32): 1.1921e-07 1.1755e-38 3.4028e+38
double (64): 2.2204e-16 2.2251e-308 1.7977e+308
long double (128): 1.0842e-19 3.3621e-4932 1.1897e+4932
上限与 2^(2^(e-1)) 一致,对于float和double,epsilon 与 2^(-f) 一致。但是对于long double,按照这种逻辑, epsilon 应该大约是 1.9259e-34 。
有谁知道,为什么不是?