なぜFLT_MINはゼロに等しいですか?
-
22-09-2019 - |
質問
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
によれば、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
あなたが標準ヘッダーファイルからFLT_MINの値を印刷しようとするときはいつでも (あなたは、出力画面で見ているよう)float.hの、あなたは0.000000を取得します。 それは実際にはエラーではありません。あなたはフォーマット指定子は%fので、この結果を得ています。 一般的には%F小数点以下6桁の数字を印刷するが、この場合には署名し、負の値を使用すると、小数点以下の桁数を大量に印刷する必要があるほど小さいます。
私はdesired-を取得するために使用%の.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を取得し、どのようにしている理由は、今、それはあなたに明確だと思います 同じ形式で正しい結果を得るためにspecifier.Thoughあなたはより良いフォーマットされた結果のために%eを使用することができます。