我想计算机器 Epsilon,这是使用 C++ 的不同数据类型e
给出的最小可能数:和.1 + e > 1
float
double
long double
这是我的代码:
#include <cstdio>
template<typename T>
T machineeps() {
T epsilon = 1;
T expression;
do {
epsilon = epsilon / 2;
expression = 1 + epsilon;
} while(expression > 1);
return epsilon;
}
int main() {
auto epsf = machineeps<float>();
auto epsd = machineeps<double>();
auto epsld = machineeps<long double>();
std::printf("epsilon float: %22.17e\nepsilon double: %22.17e\nepsilon long double: %Le\n", epsf, epsd, epsld);
return 0;
}
但我得到了这个奇怪的输出:
epsilon float: 5.96046447753906250e-008
epsilon double: 1.11022302462515650e-016
epsilon long double: -0.000000e+000
float
和的值double
是我所期望的,但是,我无法解释这种long double
行为。
有人可以告诉我出了什么问题吗?