【发布时间】:2020-03-24 00:52:17
【问题描述】:
根据维基百科,不同精度数据类型的布局是
- single precision:指数(e):8位,小数(f):23位
- double precision:e:11 位,f:52 位
- quadruple precision:e:15 位,f:112 位。
我写了一个小程序输出C++中float、double和long double的数值限制(用g++编译) p>
#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。
有谁知道,为什么不呢?
【问题讨论】:
标签: c++ epsilon quadruple-precision