0

次のプログラムの出力はどうあるべきですか?

#include <stdio.h>
#include <math.h>
#include <float.h>

int main() {
    int exp;
    float mant = frexp(FLT_MAX, &exp);
    printf("frexp(%a) = {%f, %d}\n", FLT_MAX, mant, exp);
    return 0;
}

私の amd64 Linux システムでは、glibc を使って次のように表示されます。

frexp(0x1.fffffep+127) = {1.000000, 128}

IEEE 754 ウィキペディアの記事から、「最大正規化数」の指数は 127 であることがわかります。また、指数が 128 の値は ±Infinity と NaN だけであることがわかります。

frexp のマニュアル ページから、 frexp() は [0.5, 1.0) の範囲 (つまり、1.0 を除く) の値を返す必要があることを理解しています。

これらの情報に基づいて、返された仮数と指数の両方が正しくないようです。

frexp() の機能と FLT_MAX (= (2 - 2^-23) * 2^127) の値を知ると、(2 - 2^- 23) は 2 に非常に近い。

では、frexp(FLT_MAX, ...) は何を返すべきでしょうか?

4

1 に答える 1

6

形式で印刷FLT_MAXしたことを認め%aますので、実際に値が何であるかを確認できます%f。では、 の値についてもそうしてみませんmantか?

frexp(0x1.fffffep+127) = {0x1.fffffep-1, 128}

その結果は私には驚くべきことではないようです。(IEEE-754 表現の指数は範囲 の仮数に基づいているの[1.0, 2.0)に対し、範囲frexpの仮数を生成することに注意してください[0.5, 1.0)。したがって、frexp最大指数は 1 つ大きくなります。)

道徳:浮動小数点値その外観を混同しないでください。

于 2013-08-17T05:43:44.570 に答える