现代计算机中数字的表示与浮点数、定点数

news2024/9/20 5:08:19

现代计算机中数字的表示与浮点数、定点数

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握。许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题。这篇文章讲述了浮点数的来龙去脉,所有的软件开发人员都应该读一下。而FPGA开发人员则需要知道定点数,首先要明确的是,定点数的说法是相对浮点数来说的,这篇文章同样讲述了定点数的理解。随着R&D经验的增长,自然而然会想去深入了解一些常见的东西的细节,浮点数与定点数运算就是其中之一。

  1. 浮点数规则与其运算

1.1什么是浮点数?

在计算机系统的发展过程中,曾经提出过多种方法表达实数。

  【1】典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。

  【2】浮点数表达方式, 这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102 ,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。尾数有时也称为有效数字(Significand,尾数实际上是有效数字的非正式说法。

同样的数值可以有多种浮点数表达方式,比如上面例子中的 123.45 可以表达为 12.345 × 101,0.12345 × 103 或者 1.2345 × 102。因为存在这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式:

 d.dd...d × β^e , (0 ≤ di < β)

其中 d.dd...d 即尾数,β 为基数,e 为指数。尾数中数字的个数称为精度,在本文中用 p(presion) 来表示。每个数字 d 介于 0 和基数β之间,包括 0。计算机内部的数值表达式是基于二进制的。从上面的表达式可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。特点是β 等于 2,而每个数字 d 只能在 0 和 1 之间取值。

1.2IEEE 754浮点数

        计算机中是用有限的连续字节保存浮点数的。IEEE (美国电气和电子工程师学会)定义了多种浮点格式,但最常见的是三种类型:单精度、双精度、扩展双精度,分别适用于不同的计算要求。一般而言,单精度适合一般计算,双精度适合科学计算,扩展双精度适合高精度计算。一个遵循IEEE 754标准的系统必须支持单精度类型(强制类型)、最好也支持双精度类型(推荐类型),至于扩展双精度类型可以随意。单精度(Single Precision)浮点数是32位(即4字节)的,双精度(Double Precision)浮点数是64位(即8字节)的。比如Java 平台上的浮点数类型 float 和 double 采纳了 IEEE 754 标准中所定义的单精度 32 位浮点数和双精度 64 位浮点数的格式。

        在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。

长度

符号S

指数P

尾数M

有效位数/隐含位

指数偏移

单精度

32bit

1b

8b

23b

24b/1b

127

双精度

64bit

1b

11b

52b

53b/1b

1023

拓展双精度

80bit

1b

15b

64b

64b/0b

16383

需要特别注意的是,扩展双精度类型没有隐含位,因此它的有效位数与尾数位数一致,而单精度类型和双精度类型均有一个隐含位,因此它的有效位数比位数位数多一个。

为了强制定义一些特殊值,IEEE标准通过指数E将表示空间划分成了三大块:

  1. 最小值指数(所有位全置0)用于定义0和弱规范数,E=0,M=0,数值表示0;
  2. 最大指数(所有位全值1)用于定义±∞NaNNot a Number),E=255M=0时,表示无穷, P=255M≠0时,表示NaN ;
  3. 其他指数用于表示常规的数。

现代计算机中的符号数有三种表示方法,即原码、反码和补码。

  如补码的求取:

    ①  正数(符号位为0的数)补码与原码相同.

    ②  负数(符号位为1的数)变为补码时符号位不变,其余各项取反,最后在末尾+1;即求负数的反码不包括符号位。

在计算机系统中,数值一律用补码来表示和存储。原因在于:①使用补码,可以将符号位和数值域统一处理;②同时,加法和减法也可以统一处理。此外,③补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路

1.3浮点数的误差

        很多小数根本无法在二进制计算机中精确表示(比如最简单的 0.1)由于浮点数尾数域的位数是有限的,为此,浮点数的处理办法是持续该过程直到由此得到的尾数足以填满尾数域,之后对多余的位进行舍入。

  换句话说,除了我们之前讲到的精度问题之外,十进制到二进制的变换也并不能保证总是精确的,而只能是近似值。

        事实上,只有很少一部分十进制小数具有精确的二进制浮点数表达。再加上浮点数运算过程中的误差累积,结果是很多我们看来非常简单的十进制运算在计算机上却往往出人意料。这就是最常见的浮点运算的"不准确"问题。

讲完了浮点数,如果能理解浮点数的话,那么定点数就相当好理解了。

  1. 定点数规则与其运算

2.1什么是定点数?

        首先要明确的是,「定点数」的说法是相对「浮点数」来说的。定点数,即fixed-point number, 在常用的货币10进制中,比如12.50, 就表示十二元5角0分,在货币交易中默认的都是2位小数点,也就是所谓的定点数。约定计算机中小数点的位置,且这个位置固定不变,用这种方式表示的数字就叫做定点数

2、定点数如何表示数字?

1)无符号数

        无符号数的最高位不表示符号,仅表示数值。比如我们想表示一个10.125的8bit数字,小数定点4bit,整数也是4bit,那么计算机中的数字即为1010.0010。

2)有符号数

        有符号数的最高位表示符号,0表示正数,1表示负数。那么实际上我们想表示一个+10.125的8bit数字,小数定点4bit,整数则为3bit,符号1bit,那么计算机中的数字即为0111.1111(7.9375),因为仅能表示最大示值。10.125存在溢出,溢出的处理各个计算机系统不同,有些系统中是选取最大值,有些则以若直接截取,还是以+10.125为例,01010.0010,假设截取低8bit,则为1010.0010(补码,-5.875),示值完全错误!这就涉及到了定点数的数值范围。

2.2定点数的数值范围

      

如果想表示更大范围、更高精度的值,怎么办?

  • 扩大整体位宽:比如使用 16位、32位来表示, 这样相应地整数部分和小数部分的宽度都可以增加,自然表示范围也就变大了。但是位宽的增加,也会带来更多的硬件资源开销;
  • 对固定bit位宽而言,小数点向后移动,整个数字范围就会扩大,但是小数部分的精度则会降低。小数点向前移,则精度会变高,但是数字的表示范围又会降低。所以说定点数小数点位置的确定是一个范围和精度的trade off(权衡)
  • 其实在算法部署的过程中,从算法到硬件如FPGA中最重要的一步也就是定点化。所谓的定点化,就是在不损失算法性能的前提下,利用最少的硬件资源去实现我们想要的算法,简单的比如FIR滤波器等,具体可以参见我的博客《DSP48E2使用以及FIR滤波器定点设计实现与优化》。
  1. 总结

        相对于浮点数而言,定点数的精度与数值范围均不能与之比较,定点数不仅数值的范围表示有限,而且其精度也很低。但好处就在于定点数的位宽可以设计,那么对于特定的系统而言,其资源就是最优的。定点数在硬件上比较容易实现,在实际的数字信号处理算法,如射频算法与基带算法中,定点数运算效率比浮点数的运算效率高很多,且资源开销少。因此,定点数被广泛地应用在数字信号处理的各种应用场景中。常见的定点数系统为FPGA,ASIC,MCU,部分DSP,浮点机为CPU,GPU,部分DSP等,此外当前的FPGA的底层资源甚至包含了FPU浮点运算单元。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻松搞定用户认证:微搭低代码平台打造完美登录体验01用户登录

目录 1 创建数据源2 搭建后端API3 用户登录4 最终的代码总结 欢迎阅读我们的微搭低代码全栈开发课程&#xff0c;这是我们的第二篇。在第一篇中我们整体描述了小程序的功能结构&#xff0c;这一篇我们就进入实际的开发。 在开发小程序的时候&#xff0c;第一个需要考虑的就是用…

数据结构基础讲解(一)——线性表之顺序表专项练习

本文数据结构讲解参考书目&#xff1a; 通过网盘分享的文件&#xff1a;数据结构 C语言版.pdf 链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwdze8e 提取码: ze8e 目录 前言 一.线性表的定义 二.线性表的基本操作 三.线性表的顺序存储和表示 四.顺序表中基本操作…

如何设置好看的电脑屏保?电脑屏保设置教程

如何设置好看的电脑屏保&#xff1f;电脑屏保设置教程。大家好&#xff0c;今天小编给大家带来了好看的电脑屏保&#xff0c;教大家如何设置一个好看的电脑屏保。屏保软件很多&#xff0c;今天我们介绍一款比较有特殊的屁屏保软件&#xff1a;芝麻时钟&#xff08;芝麻时钟 桌面…

【C++二分查找】1760. 袋子里最少数目的球

本文涉及的基础知识点 C二分查找 LeetCode1760. 袋子里最少数目的球 给你一个整数数组 nums &#xff0c;其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次&#xff1a; 选择任意一个袋子&#xff0c;并…

AMEsim和Simulink联合仿真生成新的.mexw64液压模型文件

AMEsim和Simulink进行联合仿真非常重要的就是AMEsim经过第四阶段Simulation会在相同文件下面生成一个与AMEsim液压模型相同名字的.mexw64文件&#xff0c;在Simulink进行联合仿真的S-Function需要找的也就是这个文件&#xff0c;只不过输入的时候除了液压模型名字之外&#xff…

形态学运算合集

圆形结构元素 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

Post-Training有多重要?一文带你了解全部细节

1. 简介 随着LLM学界和工业界日新月异的发展&#xff0c;不仅预训练所用的算力和数据正在疯狂内卷&#xff0c;后训练&#xff08;post-training&#xff09;的对齐和微调方法也在不断更新。InstructGPT、WebGPT等较早发布的模型使用标准RLHF方法&#xff0c;其中的数据管理风…

Git撤销add

git要提交版本第一步是add&#xff0c;就算是文件本身已经存在只是修改&#xff0c;也需要添加&#xff0c;即添加到暂存区。其中最偷懒和也保险的命令是&#xff1a; git add . 即添加了本地&#xff08;多称工作目录&#xff09;所有文件。 撤销add有以下文章&#xff1a; …

解决SRS流媒体服务服务器无法接收客户端ipv6 RTMP推流的思路

这篇短文我不介绍SRS是什么&#xff0c;主要介绍一个场景问题&#xff0c;场景是你使用服务器并且部署了SRS服务配置成一个媒体流转发服务&#xff0c;也就是客户端往SRS流媒体服务器推流&#xff0c;然后SRS把流转推出去&#xff0c;但是会涉及到一个问题是&#xff1a;用户客…

人工智能时代开启ai代写模式,让创作变得更加简单!

随着人工智能技术的飞速发展&#xff0c;我们的生活和工作方式正在发生翻天覆地的变化。在这个信息爆炸的时代&#xff0c;内容创作领域也迎来了新的变革——ai代写。这一模式的出现&#xff0c;让文章写作变得更加简单高效&#xff0c;为创作者们打开了新的可能。 一、ai代写的…

短剧影视小程序任意文件读取

1 漏洞描述&#xff1a; 任意文件读取&#xff1a; 在/Ems.php 控制器中的 juhecurl 方法存在curl_exec函数&#xff0c;且参数url为用户可控&#xff0c;导致漏洞产生 2 搜索语句&#xff1a; Fofa&#xff1a; "/VwmRIfEYDH.php" 3 漏洞复现&#xff1a; poc …

JVM - 字节码文件详解

文章目录 目录 文章目录 1. 无关性基石 2. Class类文件结构 magic- 魔数 主副版本号 常量池 访问标志 类索引,父类索引与接口索引集合 字段 方法 属性 3. 类加载机制 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 4. 类加载器 类与类加载器…

RT-Thread Nano版本在STM32G474上的快速移植

目录 概述 1 RT-Thread Nano 1.1 Nano版本介绍 1.2 RT-Thread Nano的特点 2 STM32Cube创建项目 2.1 配置参数 2.2 RT-Thread配置 3 RT-Thread适配MCU 3.1 预编译代码 3.2 解决编译错误 3.2.1 配置OS_TICK 3.2.2 使能finsh_config.h 3.3.3 移植FINSH 3.3 配置TICK …

《黑神话:悟空》专题合集MOD/修改器/壁纸/音乐/CG剧情

《黑神话&#xff1a;悟空》专题合集」 链接&#xff1a;https://pan.quark.cn/s/d67857f4e308 包含内容: 《黑神话&#xff1a;悟空》MOD合集 《黑神话&#xff1a;悟空》修改器&#xff08;风灵月影&#xff09; 《黑神话&#xff1a;悟空》壁纸合集 《黑神话&#xff1…

gpedit.msc本地组策略编辑器,结果发现竟然打不开了

本地组策略编辑器&#xff0c;结果发现竟然打不开了。 1建一个txt文件 List.txt &#xff0c;粘贴如下内容&#xff08;全部复制新粘贴哈&#xff09;&#xff1a; echo offpushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-Clie…

<Rust>egui学习之部件(十一):如何在窗口中添加单选框radiobutton部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第十一篇…

SpringBoot3+Vue3开发商店上货管理系统

系统介绍 上货管理系统是专门为各种类型商店打造的一款进货管理系统。针对整个商店进货流程&#xff0c;提供很多方便功能&#xff0c;帮助店家完成上货流程。比如上货清单管理功能、上货清单确认功能、供货商管理功能、商品管理功能等。 技术栈 后端&#xff1a;SpringBoot…

C++从入门到起飞之——priority_queue(优先级队列) 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、priority_queue的介绍 2、priority_queue的使用 3、priority_queue的模拟实现 3.1、仿函数的介…

Redis-主从集群

主从架构 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 主从数据同步原理 全量同步 主从第一次建立连接时&#xff0c;会执行全量同步&#xff0c;将master节点的所有数据都拷贝给sla…

Microsoft SC-100: Microsoft 网络安全架构师

SC-100认证介绍 Microsoft SC-100: Microsoft 网络安全架构师是微软网络安全方向的相关证书&#xff0c; 作为 Microsoft 网络安全架构师&#xff0c;你要将网络安全策略转化为保护组织的资产、业务和运营的功能。 你要设计、指导实现和维护遵循零信任原则和最佳做法的安全性解…