本文参照 IEEE754 二进制浮点数算术标准,以32位单精度浮点数(以下称 float )为例。
1位符号,8位阶码,23位尾数
8位阶码范围:[0,255]
偏移值:127
指数表达式: 2exponentbits−127
指数取值范围为 [−127,128].
其中 −127 保留给非规格化数,+128 保留给 infinity.
因此32位浮点数的指数取值范围是 [−126,127].
value=(−1)signbit×2exponentbits−127×(1.significandbits)2例如:
0 10001000 10000000000000000000000
其值的表达式:
(−1)0×2(10001000)2−127×(1.1)21×2136−127×1.5=768.0#include <stdio.h>
int main() {
float a = 768.0;
char *p = (char *)(&a);
for (int i = 3; i >= 0; --i) {
printf("%02x ", *(p + i));
}
printf("\n");
return 0;
}
编译运行
gcc t.c && ./a.out
输出
44 40 00 00
符合结论
0x 4 4 4 0 0 0 0 0
0b 01000100010000000000000000000000
最大值:
(−1)0×2254−127×(1.11111111111111111111111)2
=2127×(2−2−23)
≃3.4×1038
最小值:
(−1)1×2254−127×(1.11111111111111111111111)2
=−2127×(2−2−23)
≃−3.4×1038
最小规格化正值:
(−1)0×2−126×(1.00000000000000000000000)2
=2−126
≃1.18×10−38
最小非规格化正值:
(−1)0×2−126×(0.00000000000000000000001)2
=2−149
≃1.40×10−45