floatタイプ最大値と最小値
1.floatストレージ構造の理解
floatストレージ構造は別の記事を参照してくださいhttp://blog.csdn.net/whzhaochao/article/details/12885875
2.float最大値
float構造は下図の通りです.
正の最大値を取得するには、シンボルビットを0、指数ビットと末尾ビットをすべて1にすると、最大は次のようになります.
1.11111111111111111111111*2^128=(2-2^-23)*2^128= 6.805646932770577*10^38
floatタイプ16進数は0 x 7 fff ffffと表す
テストコードは次のとおりです.
結果は私たちが考えていたのと同じではなく、1.#QNAN 0、これは私もどうして知らないで、原因の返事を知っています!
指数の最下位が0であれば、私たちが望んでいる結果です.
floatは最大(2-2^-23)*2^127=3.4028234663852886*10^38であることがわかります
見てごらんh
指数を1111 1110=254とすると指数は254-127=127となる
端数ビットがすべて1の場合、最大数は1.11111111111111111*2^127=(2-2^-23)*2^127=3.4028234663852886*10^38
16進数は0 x 7 f 7 f ffffと表す
3.テストコード:
結果から分かるように
&a=12ff44
a=340282346638528860000000000000000000000.000000
これはfloatの最大値です
4.float正最小値
float.hではfloatの正の最小値が
1.175494351e-38F
および16進数0 x 0000 00001
5.テストコード
私たちが得た結果は1.000000000000 00000 01*2^-127=5.877472454760670*10^-039でしたが、結果は私たちが予測したものではありません!なぜかわからない
指数の位置を1にすると、テストコードは次のようになります.
結果は1.0000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,
floatストレージ構造は別の記事を参照してくださいhttp://blog.csdn.net/whzhaochao/article/details/12885875
2.float最大値
float構造は下図の通りです.
正の最大値を取得するには、シンボルビットを0、指数ビットと末尾ビットをすべて1にすると、最大は次のようになります.
1.11111111111111111111111*2^128=(2-2^-23)*2^128= 6.805646932770577*10^38
floatタイプ16進数は0 x 7 fff ffffと表す
テストコードは次のとおりです.
void main(int argc, char* argv[])
{
float a=-8.25;
char *p=(char*)&a;
*p=0xff;
*(p+1)=0xff;
*(p+2)=0xff;
*(p+3)=0x7f;
printf("
&a=%x",&a);
printf("
a=%f",a);
}
結果は私たちが考えていたのと同じではなく、1.#QNAN 0、これは私もどうして知らないで、原因の返事を知っています!
指数の最下位が0であれば、私たちが望んでいる結果です.
floatは最大(2-2^-23)*2^127=3.4028234663852886*10^38であることがわかります
見てごらんh
#define FLT_DIG 6 /* # of decimal digits of precision */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD 0
#define FLT_MANT_DIG 24 /* # of bits in mantissa */
#define FLT_MAX 3.402823466e+38F /* max value */
#define FLT_MAX_10_EXP 38 /* max decimal exponent */
#define FLT_MAX_EXP 128 /* max binary exponent */
#define FLT_MIN 1.175494351e-38F /* min positive value */
#define FLT_MIN_10_EXP (-37) /* min decimal exponent */
#define FLT_MIN_EXP (-125) /* min binary exponent */
#define FLT_NORMALIZE 0
#define FLT_RADIX 2 /* exponent radix */
#define FLT_ROUNDS 1 /* addition rounding: near */
指数を1111 1110=254とすると指数は254-127=127となる
端数ビットがすべて1の場合、最大数は1.11111111111111111*2^127=(2-2^-23)*2^127=3.4028234663852886*10^38
16進数は0 x 7 f 7 f ffffと表す
3.テストコード:
void main(int argc, char* argv[])
{
float a=-8.25;
char *p=(char*)&a;
*p=0xff;
*(p+1)=0xff;
*(p+2)=0x7f;
*(p+3)=0x7f;
printf("
&a=%x",&a);
printf("
a=%f",a);
}
結果から分かるように
&a=12ff44
a=340282346638528860000000000000000000000.000000
これはfloatの最大値です
4.float正最小値
float.hではfloatの正の最小値が
1.175494351e-38F
#define FLT_MIN 1.175494351e-38F /* min positive value */
floatタイプの構造を理解することによって、正の最小値を得る方法を知っています.正の最小値を得るには、指数位置を最小および0000にすれば、指数は0-127=-127になり、最後の位置を1にします.その他は0にします.および16進数0 x 0000 00001
5.テストコード
void main(int argc, char* argv[])
{
float a=-8.25;
char *p=(char*)&a;
*p=0x01;
*(p+1)=0x00;
*(p+2)=0x00;
*(p+3)=0x00;
printf("
&a=%x",&a);
printf("
a=%e",a);
}
私たちが得た結果は1.000000000000 00000 01*2^-127=5.877472454760670*10^-039でしたが、結果は私たちが予測したものではありません!なぜかわからない
指数の位置を1にすると、テストコードは次のようになります.
void main(int argc, char* argv[])
{
float a=-8.25;
float b=0;
char *p=(char*)&a;
*p=0x01;
*(p+1)=0x00;
*(p+2)=0x80;
*(p+3)=0x00;
printf("
%d ",sizeof(a));
printf("
&a=%x",&a);
printf("
a=%e",a);
}
結果は1.0000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,