当前位置: 首页 > 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.jsqmd.com/news/1026739/

相关文章:

  • 2026年靠谱的征婚相亲口碑推荐:精英婚恋机构官方甄选指南 - 优质品牌商家
  • 149.摒弃MNIST!从零训练通用DDPM扩散模型,自研高斯数据集+完整训练推理流程
  • 2026年北海黄金回收公司权威性分析:官方推荐与市场甄选指南 - 优质品牌商家
  • 2026年成都石材抛光打蜡服务商官方甄选:从众清洁等口碑企业深度评测 - 优质品牌商家
  • 2026年拉管施工队品牌甄选:专业电力、自来水、燃气非开挖顶管施工企业推荐 - 优质品牌商家
  • Hermes Agent 底层模块全景图:八大核心子系统与 37 个关键模块速查(系列开篇)
  • 灶台导航 (六):时间统筹算法——让多道菜同时上桌
  • 2026年全包家装/家庭装修/全屋整装/室内装修榜单:老房翻新/毛坯房/别墅装修口碑优选与避坑指南 - 品牌发掘
  • 2026年北京交通事故律师哪家好?5家专业团队值得推荐 - 本地品牌推荐
  • MongoDB建库原理与实操:从use到insertOne的完整流程
  • SolidWorks第四部分_直接实体建模特征7_圆角与倒角进阶
  • 2026年近期武汉地区优良的ECS电控系统源头厂家综合解析 - 品牌鉴赏官2026
  • 2026洁净室防爆吸尘器Top3:史沃斯凭实力登顶 - 工业清洁测评社
  • 文件加密软件有哪些好用的?真心推荐五款文件加密软件,快来试
  • 2026年 东莞深圳车灯改装/维修/升级推荐榜:专业宝马尾灯修复,破解发黄开裂难题,焕新爱车照明 - 品牌发掘
  • 2026年近期智能色粉机优质厂家选择指南:聚焦效率革命与精准智造 - 品牌鉴赏官2026
  • 【AI应用实战-WorkBuddy】5 分钟快速上手 WorkBuddy:安装、配置、第一个对话(二)
  • 技术破局流量困境!融景科技自研GEO技术体系,赋能惠州企业AI全域精准拓客 - Guangdong1
  • 2024优选AI工具:AI写专著高效生成20万字专著,合规又省心!
  • 李梦娇常识2026|最新版|国考
  • 2026年近期上海周边有实力的纯玩团旅行团如何选?这份深度解析与品牌指南请收好 - 品牌鉴赏官2026
  • AI工作流实现Excel全自动化(支持SQL)-案例:医院门诊排班表
  • Altair 声明式可视化:用统计思维驱动可交互数据分析
  • 2026年滦州市人防设备验收服务优选:深度解析烨鑫人防工程的核心竞争力 - 品牌鉴赏官2026
  • 2026年芜湖贵金属回收服务实地调研:哪些门店值得关注?官方甄选指南 - 优质品牌商家
  • 惠州 GEO 公司哪家好?2026技术 + 资质 + 效果真实优选答案 - Guangdong1
  • 计算机毕业设计之基于jsp的校园BBS论坛管理系统
  • 2026黄岛区专业的帮信罪辩护律师口碑排行 - 品牌排行榜
  • REFramework终极指南:轻松解决《怪物猎人:崛起》启动崩溃问题
  • 物理信息神经算子:从理论解构到工程实践的技术深度探索