第3课 浮点数的秘密

1. 内存中的浮点数——存储方式:符号位、指数、尾数的符号


类型


符号位


指数


尾数


float


1位(第31位)


8位(第23-30位)


23位(第0-22位)


double


1位(第63位)


11位(第52-62位)


52位(第0-51位)

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

2. 浮点数的存储示例

2.1 浮点数的转换步骤

(1)将浮点数转换成二进制

(2)用科学计数法表示二进制浮点数

(3)计算指数偏移后的值:(需加上偏移量,float型:+127,double型:+1023)

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

  float: 127 + 6→ 133

  double: 1023 +6 → 1029

2.2 以float型的实数8.25在内存表示法为例,演示转换过程

(1)8.25的二进制表示法:1000.01,再转为指数形式:1.00001*(2^3)

  ①符号位:0

  ②指数为3:  127+3 =130 → 10000010

  ③小数:00001。   //要转为尾数,须在后面补0

(2)内存中8.25的float表示:0 1000 0010 000 01000000 0000 0000 0000 =0x41040000

(红色部分为符号位,指数为绿色,尾数为紫色部分加补零后的23位)

【编程实现1】十进制浮点数的内存表示

#include<stdio.h>

int main()
{
    float f = 8.25;

    //为了用16进制显示出浮点数的内存表示的二进制数值,可将那
    //段内存以整数形式去显示那串二进制数,以便人类阅读
    unsigned int* p = (unsigned int*)&f; //整型指针指向f的内存
    printf("0x%08X\n", *p);  //以整型输出0x41040000
    return 0;
}

3. 浮点类型的秘密

(1)思考:int和float都占4个字节的内存,而int类型的范围:[-231,231-1],float类型的范围:[-3.4*1038,3.4*1038],为float却比int的范围大得多呢?

(2)秘密

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

  ②float可表示的数字之间是不连续的,存在跳跃

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

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

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

【编程实现】float类型的不精确示例

#include<stdio.h>

int main()
{
    float f1 = 3.1415f;
    float f2 = 123456789;

    //精确到小数点后面的10位
    printf("%0.10f\n", f1);//3.1414999962  -->不精确
    printf("%0.10f\n", f2);//123456792.0000000000 -->不连续
    //同理可实验得,float型的123456780-123456788之间的在内存中都
    //是用123456784.0000000000这个数表示的。

    return 0;
}

4. 小结

(1)浮点类型与整数类型的内存表示法不同

(2)浮点类型的内存表示更复杂

(3)浮点类型可表示的范围更大

(4)浮点类型是一种不精确的类型

(5)浮点类型的运算速度较慢

时间: 2024-12-15 06:49:59

第3课 浮点数的秘密的相关文章

C语言进阶剖析第三课--浮点数的秘密

浮点数在内存中的存储方式:符号数,指数,尾数 float与double类型的数据在计算机内部的表示法是相同的,但由于所占存储空间的不同:其分别能够表示的数值范围和精度不同 浮点数转换方法 1.将浮点数转换成二进制 2.用科学计数法表示二进制浮点数 3.计算指数偏移后的值 注意:计算指数时需要加上偏移量,而偏移量的值与类型有关.

《C语言进阶剖析》课程目录

<C语言进阶剖析>课程目录 第1课 - 基本数据类型 第2课 - 有符号数与无符号数 第3课 - 浮点数的秘密 第4课 - 类型转换 第5课 - 变量属性 第6课 - 分支语句 第7课 - 循环语句 第8课 - goto和void分析 第9课 - const 和 volatile分析 第10课 - struct和union分析 第11课 - enum, sizeof, typedef 分析 第12课 - 注释符号 第13课 - 接续符和转义符 第14课 - 单引号和双引号 第15课 - 逻辑运

聪明人的游戏,初中版 之目录

第一章算法概述    第1课 算法的概念    第2课 结构化程序设计思想    第3课 算法的时空复杂度 第二章字符串处理与进制转换    第1课 贝贝的交通指挥系统    第2课 贝贝的图形    第3课 贝贝的加密工作    第4课 贝贝的保险库密码    第5课 贝贝的数学课    第6课 贝贝与外星人    本章知识归纳    本章综合练习 第三章枚举算法    第1课 桐桐的计算    第2课 桐桐的数学难题    第3课 素数的秘密    第4课 桐桐的思考    第5课 桐桐的研

Java第二课:整数、浮点数

浮点数 带小数点的数.浮点这个词的本意就是指小数点是浮动的,是计算机内部表达非整数(包含分数和无理数)的一种方式.另一种方式叫做定点数,不过在Java中不会遇到定点数.人们借用浮点数这个词来表达所有带小数点的数. 当浮点数和整数放到一起运算时,Java会将整数转换成浮点数,然后进行浮点数的运算. 通常用double来表示浮点数的类型 浮点数计算是有误差的,当我们需要用精确的计算时,还是要用整数. 整数类型不能表达有小数部分的数.计算机里会有纯粹的整数这种奇怪的东西,是因为整数的运算比较快,而且占

第44课 函数参数的秘密(上)

1. 函数参数 (1)函数参数在本质上与局部变量相同,都在栈上分配空间 (2)函数参数的初始值是函数调用时的实参值 (3)函数参数的求值顺序依赖于编译器的实现(注意:这里指求值顺序而不是入栈顺序!) [实例分析]函数参数的求值顺序 #include <stdio.h> int func(int i, int j) { printf("i = %d, j = %d\n",i, j); return 0; } int f() { printf("f() Call...

渐入OO课的深处,探索多线程的秘密——OO第二次博客总结

一次又一次的挑战,一次又一次全新的知识,我来到了多线程的面前 第五次作业 1.度量分析 >第五次作业由于很大程度上调用的是前两次电梯的一些代码,所以存在的问题与前几次也十分相似.同时由于第一次使用多线程来解决问题,可能将某些功能过于集中的放在了个别类中.导致McCabe Cyclomatic Complexity以及Nested Block Depth出现标红的现象. 2.类图 >这次在类图上面问题体现的也很明显,在方法的分配上并没有做的很平均.这主要是由于为第一次多线程作业,所以将大部分的功

第44课 函数参数的秘密 (上)

函数参数: 函数参数的求值顺序依赖于编译器的实现: 第一感觉,这个函数会输出1和2,k的最终值会变成3. 示例程序: 1 #include <stdio.h> 2 3 int func(int i, int j) 4 { 5 printf("%d, %d\n", i, j); 6 7 return 0; 8 } 9 10 int main() 11 { 12 int k = 1; 13 14 func(k++, k++); 15 16 printf("%d\n&q

第45课 函数参数的秘密(下)

参数入栈顺序: 调用约定: gcc语言默认使用__cdecl调用约定.调用约定不是语言的一部分,是编译器的一部分. 调用约定使用的最典型的地方就是库函数的调用.因为库的编译方式我们的自己的程序的编译方式可能不一样. 小问题: 如何编写一个计算n个数平均值的函数? 示例程序: 1 #include <stdio.h> 2 3 float average(int array[], int size) 4 { 5 int i = 0; 6 float avr = 0; 7 8 for(i=0; i&

[从产品角度学EXCEL 03]-单元格的秘密

这是<从产品角度学EXCEL>系列——单元格的秘密. 前言请看: 0 为什么要关注EXCEL的本质 1 EXCEL是怎样运作的 2 EXCEL里的树形结构 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布于特定网站.不接受任何无授权转载,如需转载,请先联系我,非常感谢. 在讲了excel的树形结构之后,我们终于要进入正题,研究单元格的秘密了. 当我们打开excel的时候,首先映入眼帘的就是一大片格子,这就是单元格. 在excel里,单元格承担了几乎所有的存储信息的功能.你