c++ - 如何生成所有 float ?

标签 c++ floating-point numeric

我正在尝试将所有 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/

相关文章:

c++ - 将对象指向 NULL 会将成员值置于什么位置?

c++ - 为什么对数字执行 cout 会将内存分配给堆?

c++ - C++ 中的共享内存缓冲区不违反严格的别名规则

algorithm - 按关系对任何事物进行排序

c++ - 如何使用 G++ 抑制纯虚拟类的 C++ vtable 生成?

javascript - 如何在 Jasmine 中比较两个具有浮点值的对象?

java - 如何在 java 中从 float 转换为 bigDecimal?

floating-point - 它是 52 位还是 53 位浮点精度?

Python - 数字文字表达式

r - 在R中将字符串转换为数值