29

limits.hINT_MINおよび などの非浮動小数点演算タイプの制限を指定しますINT_MAX。これらの値は、int を使用して表すことができる最も負の値と最も正の値です。

には、 とfloat.hの定義がFLT_MINありFLT_MAXます。次の場合:

NSLog(@"%f %f", FLT_MIN, FLT_MAX);

次の出力が得られます。

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000

FLT_MAXは、ご想像のとおり、非常に大きな数に等しいのですが、なぜFLT_MIN非常に大きな負の数ではなくゼロに等しいのでしょうか?

4

4 に答える 4

58

実際にはゼロではありませんが、 を使用してprintf、またはNSLogを使用して検査すると、ゼロのように見える場合があります%f。(少なくともMac OS X 10.6.2では)に
よると、次のように説明されています。float.hFLT_MIN

/* Minimum normalized positive floating-point number, b**(emin - 1).  */

その文の肯定に注意してください:ゼロより大きいFLT_MIN最小の (正規化された) 数値を指します。(正規化されていない数値ははるかに小さい)。

最小の浮動小数点数 (負の数を含む) が必要な場合は、 を使用します-FLT_MAX

于 2010-03-27T03:30:53.250 に答える
15

'%f' 形式は、小数点以下 6 桁を固定形式で出力します。FLT_MIN ははるかに小さいため、固定小数点ではゼロのように見えます。「%e」または「%g」形式を使用すると、より適切な形式の回答が得られます。FLT_MAX も同様です。

#include <float.h>
#include <stdio.h>
int main(void)
{
    printf("MIN = %f, MAX = %f\n", FLT_MIN, FLT_MAX);
    printf("MIN = %e, MAX = %e\n", FLT_MIN, FLT_MAX);
    return(0);
}


MIN = 0.000000, MAX = 340282346638528859811704183484516925440.000000
MIN = 1.175494e-38, MAX = 3.402823e+38
于 2010-03-27T03:45:30.897 に答える
2

標準ヘッダー ファイル float.h から FLT_MIN の値を出力しようとすると、(出力画面に表示されているように) 0.000000 が返されます。これは実際にはエラーではありません。フォーマット指定子 %f. 通常、%f は小数点以下 6 桁を出力しますが、この場合、符号付きの負の値は非常に小さいため、小数点以下の桁数を十分に出力する必要があります。

%.54f(マシン依存) を使用して、目的の結果 (私のシステムでは 0.000000000000000000000000000000000011754943508222875) を取得しました。

//あなたのシステムでこれを確認してください

#include<stdio.h>
#include<float.h>
int main()
{
    printf("Minimum signed float %.55f\n",FLT_MIN);
    printf("Minimum signed float %e\n",FLT_MIN);
    return 0;
}

//出力:-

// 符号付き浮動小数の最小値 0.0000000000000000000000000000000000117549435082228750

// 符号付き浮動小数点数の最小値 1.175494e-038

CHAR_MIN で 0.000000 を取得する理由と、同じ書式指定子で正しい結果を取得する方法は明らかだと思いますが、 %e を使用してより適切な書式設定の結果を得ることができます。

于 2019-05-03T17:13:18.440 に答える