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

【计算机组成原理】浮点数表示与运算

什么是浮点数

        浮点数是一种在计算机中表示实数的方式,起因在于定点数无法有效表示非常大或非常小的数(如 3.1415、0.0000001 或 1e+20),这在科学计算、图形处理、工程建模等领域中是常见需求。为此,引入了浮点数,它通过科学计数法的思想,用符号位、阶码和尾数的组合表示实数。

        通常,浮点数表示为:

N=(-1)^S\times M\times R^E

        式中式中,S取值0或1,用来决定浮点数的符号;M是一个二进制定点小数,称为尾数,一般用定点原码(无符号)小数表示;E是一个二进制定点整数,称为阶码或指数,用移码表示。R是基数(隐含),可以约定为2、4、16等。可见浮点数由符号、尾数和阶码三部分组成。

IEEE754标准规定

        在IEEE754标准中,浮点数的格式如下:

     

        (图源王道)

        其中尾数用无符号原码表示,移码用偏置值127或1023的移码表示。

规格化浮点数
        尾数规格化

        首先,对于尾数的规格化,要求隐含一位有效位,不能够浪费尾数的精度。

        对于IEEE754,要求小数点前隐含有效位1。例如,尾数表示为0111001实际真值为1.0111001。

        对于用补码表示的尾数,要求其转换为原码后的尾数小数点后第一位为1。例如:1.11000,转换为原码后为1.01000,其中1.01000的第一个1表示符号,此时小数点后第一个有效位为0,浪费了一位尾数精度,应该进行左规变成1.10000,同时阶码-1。

        对于用基为4的原码表示的尾数,要求其小数点后两位不能同时为0。因为基为4的尾数进行左规时,尾数应移动两位。

        阶码规格化

        对于IEEE754,要求阶码不能全为0或者全为1。、

        所以对于float型,即32位浮点数,其阶码的范围为0到2^{8}-1=255扣去一个最小值和最大值,即1-254,对应真值为1-127到254-127,即-126到127

        对于double型,即64位浮点数,其阶码的范围为1到2046,对应真值为-1022到1023

        规格化浮点数的表示范围

        显然:

        1、对于单精度浮点数

        MAX:阶码=11111110=254,尾数=全1=2-2^{-23},最大真值=(2-2^23)*2^127。

        MIN:阶码=00000001=1,尾数=全0=,最小真值=1*2^-126。

        由于负数与正数在数轴上关于原点对称,所以可以得到规格化单精度浮点数的表示范围为:

        

        2、双精度浮点数也适用类似的计算方法。

非规格化浮点数

        非规格化浮点数表示表格如下:

浮点数加减法

        浮点数加减运算的步骤如下:

        1、对阶:小阶看大阶,即把阶码小的尾数进行右移。

        2、尾数相加减:如题。

        3、规格化:进行左规或者右规,使尾数符合规格化条件(不浪费尾数精度)。

        4、舍入:0舍1入。

        5、溢出判断:看阶码是否超出范围(上下溢出)。

        PS:如果发生了上下溢出,上溢机器视为正负无穷,下溢视为机器0。若开启异常监测,则报错。

类型转换问题

        程序运行中,强转、赋值、计算过程都可能带来类型转换,从【计算机组成原理】C语言中数据类型表示及转换总结中可以知道,从短型转长型过程中不会出现任何损失,即char-short-int-long;float-doule。

       首先需要记住int为32位,float尾数为23位,double尾数为52位。其他一些特殊情况列举如下:

        1、int-float

        首先int有32位,float尾数只有23位,所以int转float时很容易发生精度损失。

        2、double-float或int

        首先尾数位数得知很有可能发生精度损失;其次double表示范围远大于float和int,会发生溢出。

http://www.dtcms.com/a/290457.html

相关文章:

  • 开尔文封装的 SiC MOSFET 器件可靠性实例研究
  • Java学习----NIO模型
  • 朝歌智慧盘古信息:以IMS MOM V6重构国产化智能终端新生态
  • 20250720问答课题-基于BERT与混合检索问答系统代码解读
  • 论文笔记:EDITING MODELS WITH TASK ARITHMETIC
  • 【论文阅读】Nonparametric clustering of RNA-sequencing data
  • 【力扣】第42题:接雨水
  • Smart Tomcat
  • 人工智能教研室暑期培训flask全栈开发培训
  • 元图 CAD:PDF 与 CAD 格式互转的完美解决方案
  • 【Python 】dotenv 模块与用法介绍及Flask 集成用法示例
  • 力扣-45.跳跃游戏II
  • 解决mac chrome无法打开本地网络中的内网网址的问题
  • 【HTML】图片比例和外部div比例不一致,最大程度占满
  • CSS实现背景色下移10px
  • 网络协议(四)网络层 路由协议
  • Vue组件之间通信
  • 使用相机不同曝光时间测试灯光闪烁频率及Ai解释
  • 【Java + Vue 实现图片上传后 导出图片及Excel 并压缩为zip压缩包】
  • 过往记录系列 篇七:大A突破3500点历史梳理
  • STM32 USB键盘实现指南
  • 格式工厂5.21.0简介
  • Idea上拉取代码解决冲突的总结
  • Scott Brinker:Martech代理时代兴起,结构性的洗牌刚刚开始;SaaS定价模式迅速被按效果付费所取代
  • 时序数据库在工业物联网领域的核心优势与应用价值
  • mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程
  • MongoDB 查询时区问题
  • MySQL主从同步集群(Docker搭建)
  • 安装docker可视化工具 Portainer中文版(ubuntu上演示,所有docker通用) 支持控制各种容器,容器操作简单化 降低容器门槛
  • 详解 F.cross_entropy 与标签平滑的工作原理