当前位置: 首页 > news >正文

从0开始的C语言(八)浮点类型

下面我们来看一下浮点数和浮点类型

浮点数说白了就是小数, 而浮点类型,常用的有单精度浮点类型float 和 双精度浮点类型double

尾数(基数):一共有多少个有效数字,如3.14159的尾数(基数)就是6

指数:在浮点数存储之中确定小数点的位置,用来存10的几次幂

计算机储存浮点数也是以二进制去存储的

浮点数IEEE754指数偏移存储原理

首先我们可以通过sizeof(float)知道 单精度类型float的字节大小是4字节,也就是32位,

而这32位当中,符号位占1位, 指数位占8位

那么剩下的基数(也就是尾数)就占了23位, 加在一起正好32位

(别问我为什么这样安排,它就是这样儿!)

那就有闲的没事的人要问了,那这个8位的指数是怎么存的呢???

这里我们要声明一下,C语言的存储方式都是二进制

所以这个指数它肯定也是以二进制的方式进行存储的

那么这个八位的指数它具体该怎么以二进制的形式去存储呢?

这就要设计到一个叫做IEEE754的标准,这个标准就是定义 单精度float类型 那八位的指数 是怎么存储的

首先要说一下,符号位只有整个浮点数的开头才有,并且仅此一个,没有别的符号位了

所以指数的那八位里面没有符号位,全都是有效位

因为有八位,所以指数可以表示256个数(从0 到 255, 因为0000 0000 是0 1111 1111 是255)

而IEEE754给了一个特别巧妙的设计,它们把正负数都存到了这256个数里面

即不管浮点数的指数幂 是正的还是负的都可以用这个标准来表达

那么,是怎么用这个指数来表示正数和负数的呢?它有一个很巧妙的设计:

因为有256个数(从0 到 255), 所以对255 / 2 去掉小数点得到 127

于是就以这个127为标准, 即把127看做是0

然后往127的左边去的值叫做左偏移, 往127右边去的值叫做右偏移

(此处可以看成往左边是递减,往右边是递增)

例如,127往左边偏移一位,变成126,这就意味着 127 - 1,所以呢,如果指数的这八位最后存储

的是126的二进制数,就意味着, 该浮点数的指数是 10的-1次幂

如果是往右边偏移的话,例如指数的值是130, 即指数的这八位存储的是130的二进制数,那就意味着127往右边偏移了3位, 即 127 + 3, 就意味着, 该浮点数的指数是 10的+3次幂

IEEE754就是用这个区间 来去判断 浮点数的10的次幂是正的还是负的

例如:314159 * 10的-5次方 存到内存的时候, 首先这个数是正数,所以符号位是0

然后该数的基数(尾数)是314159, 直接转换成二进制数存到基数的23位里,

最后看指数,既然指数是 10 的-5次幂, 所以计算机判断出来是 127往左边偏移了5位, 即122

然后再把122转换为二进制数,最后存储到指数的 那八位的空间里,代表是10 的-5次幂

这个314159 * 10的-5次幂到此就存完了

大于1的浮点数是规范化浮点数(比如2.5 , 5.14 9.527)

小于1的是非规范化浮点数(比如0.99 , 0.28, 0.284)

下图的讲解就对应了我们上面说的IEEE754标准:

float类型占4字节,即32位,其中正负号占一位,中间的占23位,指数幂占八位

但其实中间那23位还有一个隐藏的第24位(隐式的位)以防不备之时(应对下溢underflow)

至于下溢是什么,我们马上就会讲解

浮点数的大小并不是由 基数(尾数)那23位 决定的,而是由指数那8位决定的

float是单精度,double是双精度

并且要注意,给float类型的变量赋值时,最好在赋的数值后面加上后缀f/F来标注出是float变量

给变量名命名不要起a,b,c这种的意义不明的名字,要起的容易理解,起的有意义,或者就是在描述某种东西

例如:person_number , temperature, speed_of_sound , score , length , height 等等

给变量命名有两种方法:驼峰命名法和下划线命名法

驼峰命名法: PersonNumber(大驼峰命名法) personNumber(小驼峰命名法)

下划线命名法:person_number

个人更喜欢用下划线命名法一点~

Float变量用%f来格式化输出

例子:

运行结果:

聪明的你可能注意到了输出的数据中有些丢失了精度,下面我们就来解答这个问题吧

float变量储存的数据可能会丢失精度

原因是因为给float变量赋的值要转化成二进制储存在电脑里

而浮点数小数点后面的小数部分在转换为二进制数时会发生一些误差(可能会转换为无限不循环的二进制数,你可以理解成有的小数点数转换为二进制数时除不开了所以变成了无限不循环二进制数)

所以会导致数值在小黑框中输出时会有一些数值上的误差

在定义float类型变量时一定要加上后缀f/F来告知别人这是float类型,提醒别人可能会发生丢失精度的问题

小扩展:在C语言的printf里,想要输出%符号,只需要打出两个%即可,即“%%”就可以输出一个%了

关于%E和%A:

例子:

运行结果:

%e和%E 以及 %a和%A只有小写和大写的区别,除此之外都一样

http://www.zskr.cn/news/1538615.html

相关文章:

  • 2026年靠谱的征婚相亲口碑推荐:精英婚恋机构官方甄选指南 - 优质品牌商家
  • Hermes Agent 底层模块全景图:八大核心子系统与 37 个关键模块速查(系列开篇)
  • 2026年拉管施工队品牌甄选:专业电力、自来水、燃气非开挖顶管施工企业推荐 - 优质品牌商家
  • 2026年全包家装/家庭装修/全屋整装/室内装修榜单:老房翻新/毛坯房/别墅装修口碑优选与避坑指南 - 品牌发掘
  • 2026年北京交通事故律师哪家好?5家专业团队值得推荐 - 本地品牌推荐
  • 文件加密软件有哪些好用的?真心推荐五款文件加密软件,快来试
  • 2026年近期智能色粉机优质厂家选择指南:聚焦效率革命与精准智造 - 品牌鉴赏官2026
  • 2026年近期上海周边有实力的纯玩团旅行团如何选?这份深度解析与品牌指南请收好 - 品牌鉴赏官2026
  • AI工作流实现Excel全自动化(支持SQL)-案例:医院门诊排班表
  • [技术深度] 2026年制造业泡泡图 (Bubble Drawing) 编制规范与数字化处理指南
  • 2026惠州GEO优化公司TOP5权威排名(行业实测官方榜单) - Guangdong1
  • HarmonyOS App 接入大模型后,架构为什么必须重构?
  • Obsidian中文社区论坛:知识管理者的协作实战指南
  • QorIQ处理器硬件配置与内存映射实战指南:从DIP开关到系统启动
  • 终极指南:3大解决方案高效解决ControlNet-v1-1 FP16模型部署与优化难题
  • MCP23X17 GPIO扩展器实战:中断、寻址与配置详解
  • 基于MPC567xF的汽车动力总成ECU硬件设计实战解析
  • VCPU极值引擎与向量源寄存器指令:性能优化与避坑指南
  • 如何用一套键鼠同时控制Windows、Mac和Linux电脑?
  • (良心整理)实测靠谱的AI论文写作软件,毕业党收藏备用
  • PCIe DMA性能测试与Linux大页内存优化实战指南
  • 从零开始学网络安全|摒弃快餐式速成,系统化白帽子完整入门指南
  • yuzu模拟器终极管理指南:3分钟实现跨平台自动更新
  • 2026年LED透镜改装终极推荐榜:阿帕/海拉/澳兹姆/超视界/立盯等双光直射多光束品牌深度评测与避坑指南 - 品牌发掘
  • HunterPie:三步快速配置,新手也能轻松掌握的《怪物猎人:世界》智能数据覆盖工具
  • 穿线管采购指南:2026年市场主流品牌与渠道甄选分析 - 优质品牌商家
  • 2026年二手电缆回收厂家选择指南:正规、专业、可靠的服务商甄选 - 优质品牌商家
  • 打卡第三天 - P2946 - 2026 - 6 - 16
  • Claude Code实战手册:从安装配置到AI驱动的工程化工作流
  • 九江房屋渗漏水检测维修、卫生间漏水免砸砖维修、漏水点精准检测、厨房漏水防水补漏、正规防水补漏公司、口碑榜TOP5靠谱推荐、本地人必选的防水维修公司 - 安佳防水