微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 跟着狄泰唐老师学C语言进阶教程的笔记之浮点数的秘密

跟着狄泰唐老师学C语言进阶教程的笔记之浮点数的秘密

时间:10-02 整理:3721RD 点击:
1. 内存中的浮点数

l 浮点数在内存的存储方式为:符号位,指数,尾数

l float与double 类型的数据在计算机内部的表示法是相同的,但是由于所占用的存储空间的不同,其分别能够表示的数值范围和精度也不同

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps2B08.tmp.png

2. 浮点数存储示例

l 浮点数的转换

A. 将浮点数转换为二进制

B. 用科学计数法表示二进制浮点数

C. 计算指数偏移后的值

l 示例:对于指数6,偏移后的值如下:

        float:127 + 6 -->133

        double:1023+ 6 -->1029

l 注意:计算指数时需要加上偏移量,而偏移量的值和类型有关,float偏移127,double偏移1023

3. 进制浮点数的内存表示

l 实数8.25的内存中的float表示

A. 8.25的二进制:1000.01-->1.00001*(2^3)

B. 符号位:0 (正数)

C. 指数:127 + 3 -->130 -->10000010

D. 小数:00001

8.25的flaot类型表示:0 10000010 00001000000000000000000  

符号位(1位)   指数位(8位)                   尾数(23位)             16进制形式

            0      10000010     00001000000000000000000  --> 0x41040000

4. 用程序验证

l 8.25在内存中的float表示的16进制形式

int test1()

{

        float f = 8.25;

        unsigned int *p = (unsigned int*)&f;

        printf("p=%#x", *p);

        return 0;

}

5. 有趣的问题

l int 类型的范围:[-2^31,(2^31)-1]

l flaot类型的范围:[-3.4*10^38,3.4*10^38]

l 思考:int和float都占用4个字节的内存,为什么float却比int的范围大得多呢?

6. 浮点数的秘密

l float能表示的具体数字的个数与int相同

l float可表示的数字之间不是连续的,存在间隙

l float只是一种近似的表示法,不能作为精确数使用

l 由于内存表示法相对复杂,float的运算速度比int慢得多

l 注意:double与float具有相同的内存表示法,因此double也是不精确的,由于double占用的内存较多,所能表示的精度比flaot高。

7. 浮点数是不精确的

int test2()

{

        float f = 3.14159;

        float f2 = 123456789;

        printf("f=%.10f\n",f); //3.1415901184

        printf("f=%.10f\n", f2);//123456792.0000000000

        return 0;

}

8. 小结

l 浮点类型与整数类型的内存表示法不同

l 浮点类型的内存表示更复杂

l 浮点类型可以表示的范围更大

l 浮点类型是一种不精确的类型

l 浮点类型是运算速度较慢


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top