3

(gcc を使用して) C++ のファイルにすべての浮動小数点数を生成しようとしています。私の最初の試みはFLT_MINFLT_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_MINFLT_EPSILONは数値の精度を破壊するため、これはうまくいきませんFLT_MAX

私はバイナリ形式で作業して追加することを考えましたが、特別な意味 (inf、-inf、NaN) をスキップするだけですが、これに最適なアプローチもわかりません。どのように数字を生成することをお勧めしますか?

4

3 に答える 3

4

他の問題がなければ、ループは正のフロートのみを生成します。最小の float は-infで、最小の有限 float は-FLT_MAXです。

とにかく、すべての正の有限浮動小数点数を生成しようとしている場合は、次のようにする必要があります。

#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 に達するまで追加することもできます。

于 2013-08-31T06:02:26.800 に答える