3

我正在尝试将所有浮点数生成到 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),但我也不确定哪种方法是最好的方法。你建议如何生成数字?

4

3 回答 3

4

即使排除其他问题,您的循环也只会生成正浮点数。最小的浮点数是-inf,最小的有限浮点数是-FLT_MAX

无论如何,如果您尝试生成所有正的有限浮点数,应该这样做:

#include <cfloat>
#include <cmath>
...
float f;
for (f=0.0f; f<INFINITY; f = nextafterf(f, INFINITY)) …

请注意,0.0 以上的最小浮点数不是FLT_MIN,而是FLT_MIN * FLT_EPSILON。也可以将 FPU 舍入模式设置为向上舍入并添加FLT_MIN * FLT_EPSILON直到达到 +inf。

于 2013-08-31T06:02:26.800 回答
2

学习IEEE 浮点格式。然后简单地生成代表有限值的所有不同位模式(跳过所有INFs 和NaNs)。

于 2013-08-31T04:14:20.613 回答
2

std::nextafter

for (float f = 0; f != FLT_MAX; f = std::nextafter(f, FLT_MAX)) { }
于 2013-08-31T07:24:40.853 回答