我正在尝试将所有 float 生成到 C++ 上的文件中(使用 gcc)。我的第一次尝试是使用 FLT_MIN
, FLT_MAX
& FLT_EPSILON
生成它们,代码是这样的:
#include <cfloat>
#include <stdio.h>
#include <iostream>
using namespace std;
int main(){
FILE* handle = freopen("todos_los_float.in","w",stdout);
for(float x = FLT_MIN; x < FLT_MAX; x = x + FLT_EPSILON)
cout << x << endl;
fclose(handle);
return 0;
}
这不起作用,因为 FLT_EPSILON 破坏了数字的精度,对于 FLT_MIN
它需要一个巨大的跳跃,并且在达到 FLT_MAX
之前停止添加太多.
我考虑过处理和添加二进制形式,只是跳过特殊含义(inf、-inf、NaN),但我也不确定哪种方法最好。您建议如何生成数字?
最佳答案
即使排除其他问题,您的循环也只会生成正 float 。最小的 float 是-inf
,最小的有限 float 是-FLT_MAX
。
无论如何,如果您要生成所有正的有限 float ,应该这样做:
#include <cfloat>
#include <cmath>
...
float f;
for (f=0.0f; f<INFINITY; f = nextafterf(f, INFINITY)) …
请注意,大于 0.0 的最小 float 不是 FLT_MIN
,而是 FLT_MIN * FLT_EPSILON
。
也可以将 FPU 舍入模式设置为向上舍入并添加 FLT_MIN * FLT_EPSILON
直到达到 +inf。
关于c++ - 如何生成所有 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18544383/