#include <stdio.h>
void get_eps(float *eps) {
*eps = 1.0f;
while ((1.0f + *eps / 2.0f) != 1.0f) {
*eps /= 2.0f;
}
}
int main(){
float eps;
get_eps(&eps);
printf("Machine Accuracy (get_eps): \t%.10g\n", eps);
return 0;
}
我正在尝试计算 float(32bit) 的机器 epsilon。
期望 1.19e-07,这是浮点类型的已知机器 epsilon,我得到 1.08e-19,这是 long double 的机器 epsilon。请帮我解决这个问题。我还有什么遗漏的地方吗?
C 标准允许实现以比标称类型更高的精度计算浮点表达式。
然而,它要求通过作业和成本来“丢弃”这种多余的精度。因此将测试更改为
(float) (1.0f + *eps / 2.0f) != 1.0f
应该可以。