浮点数的二进制表示 转自阮一峰的网络日志等网络博客

深入YOLOv8内部核心:用RepNCSPELAN4深度重构主干网络,即插即用的高效涨点方案 本文提出了一种改进YOLOv8目标检测模型的方法,通过在YOLOv8中引入RepNCSPELAN模块来提高检测性能。该模块融合了RepVGG重参数化思想与CSP-ELAN结构,在保持推理速度的同时增强特征表达能力。实验结果表明,改进后的RepNCSPELAN-YOLOv8相比原模型在多项指标上均有提升:准确率从0.84提高到0.86,召回率从0.72提升至0.81,mAP50和mAP50-95也分别提高了0.06和0.04。文章详细介绍了模块设计原理和移植步骤,包括配置文件创建、代码修改等关键环节,为YOL 阅读详情

 

前几天,我在读一本C语言教材,有一道例题:

  #include <stdio.h>

  void main(void){

    int num=9; /* num是整型变量,设为9 */

    float* pFloat=&num; /* pFloat表示num的内存地址,但是设为浮点数 */

    printf("num的值为:%d/n",num); /* 显示num的整型值 */

    printf("*pFloat的值为:%f/n",*pFloat); /* 显示num的浮点值 */

    *pFloat=9.0; /* 将num的值改为浮点数 */

    printf("num的值为:%d/n",num); /* 显示num的整型值 */

    printf("*pFloat的值为:%f/n",*pFloat); /* 显示num的浮点值 */

  }

运行结果如下:

  num的值为:9
  *pFloat的值为:0.000000
  num的值为:1091567616
  *pFloat的值为:9.000000

我很惊讶,num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?

要理解这个结果,一定要搞懂浮点数在计算机内部的表示方 法。我读了一些资料,下面就是我的笔记。

2.

在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。

  int num=9;

上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。普通的32位计算机,用4个字节表示int变量,所以9就被保存为00000000 00000000 00000000 00001001,写成16进制就是0x00000009。

那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000?

3.

根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

  V = (-1)^s×M×2^E

  (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

  (2)M表示有效数字,大于等于1,小于2。

  (3)2^E表示指数位。

举例来说,十进制的5.0,写成二进制是101.0,相当于1.01×2^2。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。

十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。

IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

5.

IEEE 754对有效数字M和指数E,还有一些特别规定。

前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂。

首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

然后,指数E还可以再分成三种情况:

(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。

(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

(3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

6.

好了,关于浮点数的表示规则,就说到这里。

下面,让我们回到一开始的问题:为什么0x00000009还原成浮点数,就成了0.000000?

首先,将0x00000009拆分,得到第一位符号位s=0,后面8位的指数E=00000000,最后23位的有效数字M=000 0000 0000 0000 0000 1001。

由于指数E全为0,所以符合上一节的第二种情况。因此,浮点数V就写成:

  V=(-1)^0×0.00000000000000000001001×2^(-126)=1.001×2^(-146)

显然,V是一个很小的接近于0的正数,所以用十进制小数表示就是0.000000。

7.

再看例题的第二部分。

请问浮点数9.0,如何用二进制表示?还原成十进制又是多少?

首先,浮点数9.0等于二进制的1001.0,即1.001×2^3。

那么,第一位的符号位s=0,有效数字M等于001后面再加20个0,凑满23位,指数E等于3+127=130,即10000010。

所以,写成二进制形式,应该是s+E+M,即0 10000010 001 0000 0000 0000 0000 0000。这个32位的二进制数,还原成十进制,正是1091567616。

 

 

***************************************************

 

其实整体来说,浮点数的表示方法跟我以前自己YY的差不多,需要有符号位,有数值位,还要有信息标识小数点的位置。看了这篇文章之后还比较质疑的就是在这种表示下,怎样能方便的实现浮点数的四则运算?怎样实现浮点数到整形甚至是到无符号整形的转换?

设两个浮点数 X=Mx*2Ex ,Y=My*2Ey

***************************************************

实现X±Y要用如下5步完成:

 

(1)对阶操作:小阶向大阶看齐

(2)进行尾数加减运算

(3)规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位(就是使用00表示正数,11表示负数,01表示上溢出,10表示下溢出)的补码尾数来说,就必须是

001×××…×× 或110×××…××的形式

若不符合上述形式要进行左规或右规处理。

(4)舍入操作:在执行对阶或右规操作时常用“0”舍“1”入法将右移出去的尾数数值进行舍入,以确保精度。

(5)判结果的正确性:即检查阶码是否溢出

 

若阶码下溢(移码表示是00…0),要置结果为机器0;

若阶码上溢(超过了阶码表示的最大值)置溢出标志。

 

现在用一个具体的例子来说明上面的5个步骤

 

例题:假定X=0 .0110011*211,Y=0.1101101*2-10(此处的数均为二进制), 计算X+Y;

 

首先,我们要把这两个数变成2进制表示,对于浮点数来说,阶码通常用移码表示,而尾数通常用补码表示。

 

要注意的是-10的移码是00110

        [X]浮: 0        1 010  1100110

        [Y]浮: 0        0 110  1101101

                   符号位 阶码   尾数

 

(1)求阶差:│ΔE│=|1010-0110|=0100

 

(2)对阶:Y的阶码小,Y的尾数右移4位

        [Y]浮变为 0 1 010 0000110 1101暂时保存 

 

(3)尾数相加,采用双符号位的补码运算 

     00 1100110 

   +00 0000110 

     00 1101100

 

(4)规格化:满足规格化要求 

 

(5)舍入处理,采用0舍1入法处理

 

故最终运算结果的浮点数格式为: 0 1 010 1101101

 

即X+Y=+0. 1101101*210 

 

浮点数的乘除法

 

(1)阶码运算:阶码求和(乘法)或阶码求差(除法)

    即  [Ex+Ey]移= [Ex]移+ [Ey]补 

          [Ex-Ey]移= [Ex]移+  [-Ey]补

(2)浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理

 

例题:X=0 .0110011*211,Y=0.1101101*2-10  求X*Y

 

解:[X]浮: 0 1 010 1100110

        [Y]浮: 0 0 110 1101101

 

(1)阶码相加 

[Ex+Ey]移=[Ex]移+[Ey]补=1 010+1 110=1 000 

1 000为移码表示的0

 

(2)原码尾数相乘的结果为:

0 10101101101110

 

(3)规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。

 

(4)舍入处理:按舍入规则,加1进行修正

 

所以 X※Y= 0.1010111*20 

 

 

具体来源参考:

http://www.cnblogs.com/flyingbread/archive/2007/03/02/660206.html

http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

高通SDX35:SGMII接口PHY RTL8211FSI-CG驱动适配 高通SDX35 RTL8211F SGMII 阅读详情

相关推荐

【Latex】【附安装文件】Miktex和TexStudio的安装与配置

这代表“构建并运行”,一般来说,我们只需要点这个按钮来运行Latex代码。保存一下代码文件,再运行一次,PDF文件会出现在与代码文件相同的文件夹下。安装完成后,你可能会跳转到一个页面中,你看到这个页面就意味着安装成功了。其实不需要你敲,你只要将下面的代码复制粘贴到你刚刚的文件中即可。成功安装MikTex后,我们需要进行更新,减少后续使用的麻烦。如果懂得将安装路径设置在你想要的盘中,你可以自己设置。双击上文的.exe文件后,你会看到如下画面。如果不懂,为避免不必要的麻烦,请直接点击“

未来就在脚下。 1万+

UE4 Visual Logger:AI行为与复杂Bug的可视化调试实战指南

在游戏开发与软件工程中,调试是定位和解决问题的核心环节。传统日志输出依赖纯文本,难以直观呈现动态、空间相关的运行时状态。可视化调试技术应运而生,它通过图形化方式实时或回放展示程序内部逻辑、数据流与空间关系,极大提升了复杂系统(如游戏AI、物理模拟、网络同步)的分析效率。其技术价值在于将抽象的逻辑状态转化为可视的时空信息,使开发者能“看见”代码执行过程,从而精准定位非确定性Bug、优化算法逻辑。这一技术在游戏开发、机器人仿真、物联网等需要处理大量时空数据的领域有广泛应用。本文聚焦于虚幻引擎4(UE4)内置的V

weixin_30861797的博客 436

【HarmonyOS】ArkUI的组件扩展

ArkuI的组件扩展主要是通过等装饰器来对于一些常用的自定义组件进行封装, 来简化UI开发流程, 提高自定义组件的可复用性。

2302_79763237的博客 1167

阮一峰C语言教程_06数据类型

整数类型用来表示较大的整数,类型声明使用int关键字。int a;上面示例声明了一个整数变量a。不同计算机的int类型的大小是不一样的。比较常见的是使用4个字节(32位)存储一个int类型的值,但是2个字节(16位)或8个字节(64位)也有可能使用。

muyouzhutian的博客 930

麒麟银河操作系统V10部署ffmpeg(也能用于Linux系统)

部署ffmpeg用来处理视频的各种操作,如编码解码,格式转换,剪辑,处理实时视频流,音频流,加滤镜等

zhouwenxing666的博客 9041

OpenClaw实操:给网站装上“智能眼睛”?手把手教你用OpenClaw实时监控网站

本文介绍如何在Windows系统使用OpenClaw构建智能网站监控助手。手把手教你通过配置本地AI模型,让openclaw构建的ai助手自动检测指定网页的内容变化,理解更新重要性,并及时通过邮件、微信、Telegram等渠道发出预警,让你第一时间掌握关键信息,彻底告别手动刷新。

plawuyue的博客 2163

Flex 布局教程:语法篇(阮一峰)

阿里云  >  教程中心   >  html教程  >  Flex 布局教程:语法篇(阮一峰)  Flex 布局教程:语法篇(阮一峰) 发布时间:2018-03-12 来源:网络 上传者:用户 关键字: 一峰 语法 布局 教程 flex 发表文章摘要:...

呓语煮酒的博客 8653

病理图像处理个人手札(三)WSI & MIL

1.什么是WSI? WSI全称是Whole Slide Image,也就是全视野数字切片,主要应用在病理学细胞图像领域。WSI 是利用数字扫描仪对传统的病理切片进行扫描,采集具有高分辨率的数字图像,再通过计算机将得到的碎片化图像进行无缝拼接整合,制作可视化数字图像的一项技术。与传统载玻片相比,很好地解决了传统的玻璃切片易损坏、易褪色、易丢片、检索困难的问题。 一言以蔽之,WSI是对传统载玻片进行数字化。 由于是全视野,因此它将包含多尺度的切片在一个文件上面。因此WSI将使用到金字塔模型满足其支持不同分辨率的

baiweizeng的博客 1万+

阮一峰老师 CSS Grid 网格布局教程(转载)

特别声明:这篇博客转载于阮一峰老师,转载是为了方便日后复习,实在写的太棒了。 <!-- div class="asset-body" --> <h2>一、概述</h2> 网格布局(Grid)是最强大的 CSS 布局方案。 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的.

鸭绒的博客 3万+

Linux虚拟机mysql安装教程(详细步骤)出现了一个错误:依赖检测失败

Linux虚拟机安装mysql的详细步骤(有报错预警哦)

m0_74953387的博客 5258

Python 爬虫实战:在丁香医生抓取健康科普文章阅读量,普及健康知识

requests:用于发送 HTTP 请求,获取网页内容。或 lxml:用于解析 HTML 页面,提取目标数据。pandas:用于数据清洗和分析。matplotlib和seaborn:用于数据可视化。通过本项目,我们实现了以下目标:使用 Python 爬虫抓取丁香医生的健康科普文章阅读量。对数据进行清洗和分析,找出热门文章。通过可视化展示数据,并普及健康知识。

u014481728的博客 1567

原码、反码、补码的互相转换

本文是为了计算机组成原理复习,本文以具体题目的方式来对原码、反码、补码的互相转换进行讲解。

jakelihua 2611

prplOS适配USB LAN网卡

本文介绍了将USB LAN网卡(如rndis0)适配到prplOS的LAN管理流程。

四儿家的小祖宗的博客 322

浅解析原码 反码 补码 移码 以及计算机中为何要使用补码当作存储形式 为什么补码的范围比原码和反码多1

我们日常所说的二进制 十进制 都是在原码的角度 比如说 十进制数10 转成二进制 就是 0000 1010 (在计算机中一个数字是要占一个字节的 一个字节是8位所以是0000 1010) 所以数字10的 原码:0000 1010 同理数字-10的 原码:1000 1010 (首位理解为符号位) 那么现在问题来了,如果这个时候需要做一个减法运算,例如10-10的运算,因为计算机中没有减法器,所以我们...

nb_zsy的博客 1520

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

学习哈哈哈哈

所以,互斥锁加锁失败时,会**从用户态陷入到内核态**,让内核帮我们切换线程,虽然**简化了锁的难度,但是存在一定的性能开销成本**(在加锁失败和锁被释放时,分别会有一次上下文切换,如果代码执行的时间很短,可能上下文切换的时间都比锁住的代码执行时间还长)。> > > 写优先锁:当读线程 A 先持有了读锁,写线程 B 在获取写锁的时候,会被阻塞,并且在阻塞过程中,后续来的读线程 C 获取读锁时会失败,于是读线程 C 将被阻塞在获取读锁的操作,这样只要读线程 A 释放读锁后,写线程 B 就可以成功获取读锁。

zhounixing的博客 632

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

YAML语法

YAML 取材自 YAML 语言教程 - 阮一峰的网络日志 (ruanyifeng.com) python yaml用法详解 - konglingbin - 博客园 (cnblogs.com) 简介 YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。 它的基本语法规则如下。 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格。 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。 字符串无需引号(""或''

weixin_41974877的博客 210

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

road to master

直观魔鬼数字函数/类过长圈复杂度高函数/变量命名不规范等建议:规范性的问题,尽量通过工具去扫描微观类字段定义不合理函数功能不单一变量作用域过长等建议:代码局部层面问题,重点排查,优先关注宏观类职责不单一上帝类分层不清楚上下文混乱等建议:需求本身设计,类定义,类结构关键设计问题,这些问题需要结合业务和架构发展CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。

zhounixing的博客 837

C/C++ 一些知识点总结

临时整理的,有些可能不对。 1)如果一个类里面有const-qualifier或reference, compiler不会为它生成default copy assignment operator函数。 2) Hidden是指子类和父类有同名函数,但又没有virtual关键字。这里函数只要同名就可以了,参数并不需要match。也就是说,compiler只要在子类看到有这个函数名,即使参数不...

roufoo的博客 3399

总结布局方法(position、transform、float、grid、flex)

总结布局方法(position、transform、float、grid、flex) Position 布局有以下几个属性值:realtive、absolute、fixed、static。 static:无特殊定位,对象遵循正常文档流,默认取该值。top,right,bottom,left等属性不会被应用。 relative:对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。而其层叠通过z-index属性定义。 absolute:对象脱离正常文档流,某

willwe的博客 627

浮点数的二进制表示

<br />前几天,我在读一本C语言教材,有一道例题:<br />  #include <stdio.h><br />  void main(void){<br />    int num=9;/* num是整型变量,设为9 */<br />    float* pFloat=&num; /* pFloat表示num的内存地址,但是设为浮点数 */<br />    printf("num的值为:%d/n",num);/* 显示num的整型值 */<br />    printf("*pFloat的值为:%

PlayBoy's 部落格 2746

阮一峰 javascript_[JavaScript] JS 里的数据类型

JavaScript 中有几种数据类型?一共有 6 种,分别是。(ES6 中又增加了一种数据类型Symbol,本人还没有学习到,先不讨论)数值(number):整数和小数字符串(string):文本布尔值(boolean):表示真伪的两个值,true (真)和 false (假)undefined:表示未定义null:表示空值对象(object):各种值的集合。在我看来,数值、字符串、布尔值这三个...

weixin_39904522的博客 444

浮点数在计算机内存中的表示

声明: 本文转载自:阮一峰的博客,http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 张玉彬的博客 http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html 1. 前几天,我在读一本C语言教材

小小码农 2173

Javascript标准参考教程(阮一峰)笔记总结---语法篇

(1)基本语法 标识符 1、标识符(identifier)是用来识别具体对象的一个名称。最常见的标识符就是变量 名,以及后面要提到的函数名。 2、第一个字符,可以是任意Unicode字母(包括英文字母和其他语言的字母); 3、中文是合法的标识符,可以用作变量名。 注释 1、也

chaselss的博客 5209

计算机组成原理之移码表示法

移码表示法移码移码的定义移码和补码的关系 移码 移码的定义 其中,x为真值,n为整数真值的位数。 举例: ①x=+10100,[x]移=25+0,10100=1,10100 ②x=-10100,[x]移=25+(-0,10100)=0,01100 注意: 用逗号将符号位和数值位分开 因为移码通常用于表示浮点数的阶码,而阶码又是个K位的整数,所以这里只说整数的移码的用法 +0和-0的移码相同 移码和补码的关系 补码与移码只差一个符号位。 对一个数补码的符号位取反得到该数的移码;对一个数移码的符号位取反得

David_house的博客 2万+

补码和移码

补码和移码,已经它们的互换。

做而论道的博客 8297

原码、反码、补码、移码及其运算

原码: 如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。 例如: X=+101011 , [X]原= 00101011 X=-101011 , [X]原= 10101011 位数不够的用0补全。 PS:正数的原、反、补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0。 反码: 知道了什么是原码,那反码就更是张飞吃豆芽——小菜一碟了。知道了原码,那么你只需要具备区分0跟1的能力就可以轻松求出反码,为什么呢?因

Chenweidalao的博客 1万+
上一篇: Java中XML的输出
下一篇: Try Windows Live Writer
NowhereFish
博客等级 码龄20年 1粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值