C语言进阶——浮点数的秘密03
浮点数在内存中的储存方式为:符号位 指数位 尾数
- float和double类型的数据在计算机内部的表实方法是一样的,但是由于所占的存贮空间的不同,其分别能表示的数值范围和精度不同。
类型 | f符号位 | 指数 | 尾数 |
float | 1位(第31位) | 8位(第23位--30位) | 23位(第0--22位) |
double | 1位(第63位) | 11位(第52位--62位) | 52位(第0--51位) |
浮点数的转换:
- 将浮点数转化位二进制
- 用科学计数法表实二进制浮点数
- 计算指数偏移后的值
rember:计算指数的时候需要加上一个偏移量,但是偏移量和类型是有关系的:
对于指数6:
- float:127+6=133
- double:1023+6=1029
实数8.25在内存中的float表实:8.25的二进制表实:1000.01-》1.00001*(2^3)
- 符号位:0
- 指数:127+3=130-》10000010
- 小数:00001
内存中8.25的float表示:
- 0 10000010 00001000000000000000000 -》0x41040000
代码示例1:
#include <stdio.h> int main() { float f = 8.25; unsigned int* p = (unsigned int*)&f; printf("0x%08X\n", *p); return 0; }
用float存贮8.25,然后用一个unsigned int类型的指针指向它,最后输出这个指针类容的16进制
有趣的问题:int类型的存贮范围是 -2^31~~2^31-1,float的存贮范围是-3.4*10^38~~3.4*10^38,为什莫在内存中都是4个字节,但是存贮的范围差距这莫大?
- float能表实的具体数字的个数与int是相同的
- float可表示的数字不是连续的,存在间隙
- float只是一种近似的表实法,不能作为精确数使用
- 由于float内存表实相对复杂。float的运算速度比int慢一些
- 注意:double与float具有相同的内存表示法,因此double也是不精确的。由于double占用的内存较多,所能表示的精度比float要高
代码示例2:
#include <stdio.h> int main() { float f = 3.1415f; float fl = 123456789; printf("%0.10f\n", f); printf("%0.10f\n", fl); return 0; }
为什莫输出结果会折磨奇怪呢,就是因为浮点数不是精确的,它是不连续的存在间隙
小结:
- 浮点数与整数类型的内存表示法不同
- 浮点数的内存表示更加复杂
- 浮点类型可表示的范围更大
- 浮点数是一种不精确的类型
- 浮点类型的运算速度更慢