limits.h
は、非浮動小数点演算タイプの制限を指定します。 INT_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
は、非常に大きな負の数ではなく、ゼロに等しいのでしょうか。
実際にはゼロではありませんが、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
を使用します。
'%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
標準ヘッダーファイル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を使用すると、より適切な形式の結果を得ることができます。