2 浮点数
内存中的浮点数
-
浮点数在内存中的存储方式为:符号位,指数,尾数
类型 符号位 指数 尾数 float 1位(第31位) 8位(第23-30位) 23位(第0-222位) double 1位(第63位) 11位(第52-62位) 52位(第0-51位) -
float与double类型的数据在计算机内部的表示法是相同的,但由于所占存储空间 的不同,其分别能够表示的数值范围和精度不同。
浮点数存储示例
-
浮点数的转换
-
将浮点数转换成二进制
-
用科学计数法表示二进制浮点数
-
计算指数偏移后的指
-
注意:计算指数时,需要加上偏移量,偏移量的值与类型有关
如:对于指数6,偏移后的指如下:
float:127+6 -> 133double:1023+6 -> 1029
-
-
示例:实数8.25在内存中的
float表示- 8.25的二进制表示:1000.01 -> 1.00001*(2^3)
- 符号位:0
- 指数:127+3 ->130 -> 1000 0010
- 小数:00001
- 内存中8.25的
float表示为:0 10000010 00001000000000000000000 -> 0x41040000
#include <stdio.h> int main() { float f = 8.25; unsigned int* p = (unsigned int*)&f; //%08x为整型以16进制方式输出的格式字符串,会把后续对应参数的整型数字,以16进制输出。08的含义为,输出的16进制值占8位,不足部分左侧补0。 printf("0x%08X\n", *p); return 0; } //输出结果: 0x41040000
int 和 float 表示的范围
-
int类型的范围:\([-2^{31},2^{31}-1]\) -
float类型的范围:\([-3.4*10^{38},3.4*10^{38}]\) -
int和float都占4个字节的内存,为什么float却比int的范围大得多?float能表示的具体数字的个数与int相同float可表示的数字之间不是连续的,存在间隙float只是一种近似的表示法,不能作为精确数使用- 由于内存表示法相对复杂,
float的运算速度比int慢得多
#include <stdio.h> int main() { float f = 3.1415f; float f1 = 123456789; printf("%0.10f\n", f); printf("%0.10f\n", f1); return 0; } //输出结果: 3.1414999962 123456792.0000000000

浙公网安备 33010602011771号