web-dev-qa-db-ja.com

FLT_MINがゼロに等しいのはなぜですか?

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

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

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

次の出力が得られます。

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000

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

28
Nick Forge

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

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

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

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

54
Nick Forge

'%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
12

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

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

//システムでこれを確認します

#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.0000000000000000000000000000000000000117549435082228750

//最小符号付きフロート1.175494e-038

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

0
Apurba Ghosh