浮点数的定点化

写在前面

首先要说明的是,题目《浮点数的定点化》中所谓的 浮点数 并不是指 IEEE754 规定的 单精度浮点数 或者 双精度浮点数 等格式,而是指10进制小数。所以说白了,这篇文章要讲的就是如何将10进制小数采用定点数的形式表示。


为什么2进制无法精准地表示10进制小数?

你在学习进制转换时,有没有关注过这样一个问题:

为什么10进制小数转成2进制小数的题目通常都会规定有效位数?

例如:将10进制数 0.1 转换为 2进制小数,要求小数有效位数为5位。按照转换方法–乘2直到小数部分为0即可。

那么 0.1(D)= 0.0001100110011····,这时你就会发现,这个乘法过程似乎可以一直持续下去,但是好在题目只要求到小数点后5位,所以结果是 0.00011

这能说明一个问题:10进制数 0.1 没办法被2进制精准地表示。不过某些小数,在特定的位宽下是可以被2进制精准表示的,比如:

0.5(D)= 0.1(B)

0.25(D)= 0.01(B)

0.875(D)= 0.111(B)

Why?

整数的2进制表示却没有这个问题,只要不限制位宽,那10进制整数一定可以被2进制精准表示,比如:

17(D)用4位2进制数无法表示,因为它的最大范围是4’b1111即15,但可以被5位及更多位的2进制数表示。

关于这一点可以从两个方面去理解:

  1. 整数是离散的,在固定范围内整数的个数是固定的,比如在0~15范围内那必然只有16个整数;而小数是连续的,在固定范围内小数的个数是无限。不管采用定点数还是浮点数的形式,那都是在用有限的编码个数来表示无限的小数,所以某些小数必然无法精准表示。
  2. 2进制整数的最小单位是最低位,即10进制的 “1”,所以整串数字可以看做是数个 “1” 的和,而显然任何整数都可以被 “1” 整除。但小数的2进制表示的最小单位是随着位宽而变化的,比如1位小数的最小单位是0.5,2位小数是0.25。所以不管是几位小数,这些 “最小单位” 都无法做到能整除所有小数。

至此,可以得出结论:并非所有的10进制小数,都可以被2进制数精确表示,在这个进制转换的过程中某些小数一定会存在误差。


浮点数到定点数

将浮点数转为定点数,也叫做 浮点数的定点化

定点化首先需要约定好定点数的规格:**用几位表示整数,用几位表示小数,要不要表示符号位?**这些规格需要根据输入数据的范围和特性而定(这些往往在算法阶段确定)。

假如要输入的数据 a 的范围在 -9~5 之间,要求精度保留5位。那么绝对值最大的| -9 |至少需要用4位(1001)才能表示,所以整数部分为4位。综上,数据 a 的定点化规格应为:符号位1位,整数部分4位,小数部分5位,共10位。

假设a的一个值是 3.1415,那么它的定点化过程如下:

  1. 小数部分5位,则分辨率为2 ^ -5=0.03125。3.1415转化为2进制小数相当于在算需要多少个分辨率小数来表示它,所以转化过程为 3.1415 / 2 ^ -5 = 3.1415 × 2 ^ 5 = 100.528。
  2. 这个结果只能取整数部分,因为二进制小数相对其分辨率来说,只能表示整数个。例如两位小数的分辨率是1/4 = 0.25,那么 0.00-0.11(B)就分别表示0.01(B)即0.25(D)的0-3倍,即0、0.25、0.5、0.75。
  3. 取整的方法有两种:
    1. 直接截去小数部分(truncate),这相当于数学上的向下取整(floor),就电路设计角度而言,截去的实现是很简单的,所以这种方法最为常用;
    2. 四舍五入(round),这样产生的误差比直接截断的误差小,但是需要多余的电路来实现,因此不太常用。
  4. 将结果100.528的小数部分截掉,为 100(D),可以理解为需要100个0.03125才能表示,即3.1415(D) = 100(D) × 0.00001(B),所以只要将100转化为2进制表示即可,即100(D)= 1100100(B)。因为设计的位宽是10位,所以需要补上符号位和在整数部分的高位补0,即最终结果为 0_0011_00100 。

0_0011_00100表示的值为 +3.125,它和原始数之间的差值就是 量化误差,为|3.125 - 3.1415| = 0.0165。量化误差是在量化过程中因为截断或四舍五入所直接产生的,但本质上还是因为有限个2进制编码无法表示无穷个10进制小数。

浮点数乘以2^Q,然后四舍五入或截去小数,就是定点数。其中Q为定标值(以确定小数位数)。


定点数到浮点数

还是要先说明,这个浮点数不是IEEE754规定的浮点数,仅指10进制小数,显然这就是定点化的逆过程。以 定点数0_0011_00100 的转换为例:

  • 首先需要确定该定点数的规格,假设其规格如下:1位符号位 + 4位整数部分 + 5位小数部分
  • 符号位为0说明这是一个正数
  • 整数部分的值为0011,即10进制的3
  • 小数部分的值为00100,即10进制的0.125(可以理解为0.03125×4)
  • 综合起来的结果就是 +3.125

整个过程相对简单,只要将整数部分和小数部分分别从2进制转换为10进制,再结合起来即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch 计算深度模型的大小

计算模型大小的方法 卷积 时间复杂度 与 空间复杂度 的计算方式: C 通道的个数,K卷积核大小,M特征图大小,C_l-1是输入通道的个数,C_l是输出通道的个数 1 模型大小 MB 计算模型的大小的原理就是计算保存模型所需要…

嵌入式全栈开发学习笔记---Linux基本命令2

目录 cp 源路径 目的路径 cp -r 源路径 目的路径 mv 源路径 目的路径 mv oldname newname 接下来我们继续介绍两个常用的命令 一个是拷贝文件,一个是剪切文件 ,或者也可以用来改名字。 cp 源路径 目的路径 “cp”用来拷贝文件或者目录,…

jpa分页插件对象Pageable出现了错误异常如何解决?

jpa分页插件对象Pageable出现了错误异常如何解决?! 一般来说,遇到这种的错误异常情况,通常情况 下,都是因为程序员把传递的分页页码数字写错了。 正常情况下,分页页码起始数字应该是0;而不是1…

【研发管理】产品经理知识体系-产品创新中的市场调研

导读:在产品创新过程中,市场调研的重要性不言而喻。它不仅是产品创新的起点,也是确保产品成功推向市场的关键步骤。对于产品经理系统学习和掌握产品创新中的市场调研相关知识体系十分重要。 目录 概述:市场调研重要性 1、相关概…

Python脚本:论文必备!给PDF指定页面后添加空白页

一、代码 直接上代码 import PyPDF2,os from datetime import datetimedef add_blank_pages(pdf_path, page_numbers):pdf_writer PyPDF2.PdfWriter()timestamp datetime.now().strftime("%Y%m%d%H%M%S")# 读取PDF文件with open(pdf_path, rb) as pdf_file:pdf_r…

【Java EE】Spring核心思想(一)——IOC

文章目录 🎍Spring 是什么?🎄什么是IoC呢?🌸传统程序开发🌸传统程序开发的缺陷🌸如何解决传统程序的缺陷?🌸控制反转式程序开发🌸对比总结 🌲理解…

Kafka学习笔记01【2024最新版】

一、Kafka-课程介绍 官网地址:Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/ kafka 3.6.1版本,作为经典分布式订阅、发布的消息传输中间件,kafka在实时数据处理、消息队列、流处理等领域具有广泛…

检测水箱水位传感器有哪些?

生活中很多家电中都内含一个水箱,例如电蒸锅、饮水机、蒸汽熨斗、咖啡机等等,这些内部都有水箱,或大或小。当然水箱也有很多种类型,例如生活水箱、生产水箱、消防水箱等等。 把水储存在水箱中也会遇到这些问题,水箱没…

JavaScript云LIS系统源码 前端框架JQuery+EasyUI+后端框架MVC+SQLSuga大型医院云LIS检验系统源码 可直接上项目

JavaScript云LIS系统源码 前端框架JQueryEasyUI后端框架MVCSQLSuga大型医院云LIS检验系统源码 可直接上项目 云LIS系统概述: 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff…

pytest-asyncio:协程异步测试案例

简介:pytest-asyncio是一个pytest插件。它便于测试使用异步库的代码。具体来说,pytest-asyncio提供了对作为测试函数的协同程序的支持。这允许用户在测试中等待代码。 历史攻略: asyncio并发访问websocket Python:协程 - 快速创…

SVGDreamer: 文本引导矢量图形合成

现有的 Text-to-SVG 方法还存在两个限制:1.生成的矢量图缺少编辑性;2. 难以生成高质量和多样性的结果。为了解决这些限制,作者提出了一种新的文本引导矢量图形合成方法:SVGDreamer。 论文题目: SVGDreamer: Text Guid…

《Git---Windows Powershell提交信息中文乱码解决方案》

解释: Windows PowerShell中的Git乱码通常是因为字符编码不正确或Git配置不支持Windows系统的默认编码导致的。Git在处理文件时可能使用UTF-8编码,而Windows系统的命令行工具(如PowerShell)默认使用的是Windows-1252或GBK编码。 …

【库函数】Linux下动态库.so和静态库.a的生成和使用

目录 🌞1. Linux下静态库和动态库的基本概念 🌞2. 动态库 🌊2.1 动态库如何生成 🌍2.1.1 文件详情 🌍2.1.2 编译生成动态库 🌊2.2 动态库如何使用 🌍2.2.1 案例 🌍2.2.2 动态…

TCP详解

2.1TCP 由IETF的RFC793定义的传输控制协议(Transmission Control Protocol,TCP)是一种基于字节流的传输层通信协议。在传输数据前需要在发送与接收者之间建立连接,通过相应机制保证其建立连接的可靠性。 TCP协议具备以下特性&am…

云备份项目->配置环境

升级gcc到7.3版本 sudo yum install centos-release-scl-rh centos-release-scl sudo yum install devtoolset-7-gcc devtoolset-7-gcc-c source /opt/rh/devtoolset-7/enable echo "source /opt/rh/devtoolset-7/enable" >> ~/.bashrc 安装Jsoncpp库 sud…

十、多模态大语言模型(MLLM)

1 多模态大语言模型(Multimodal Large Language Models) 模态的定义 模态(modal)是事情经历和发生的方式,我们生活在一个由多种模态(Multimodal)信息构成的世界,包括视觉信息、听觉信息、文本信息、嗅觉信…

STM32与Proteus的串口仿真详细教程与源程序

资料下载地址:STM32与Proteus的串口仿真详细教程与源程序 资料内容 包含LCD1602显示,串口发送接收,完美实现。 文档内容齐全,包含使用说明,相关驱动等。 解决了STM32的Proteus串口收发问题。 注意:每输…

IP-guard getdatarecord 存在任意文件读取

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、产品介绍 IP-guard是由溢信科技股份有限公司开发的一款终端安全管…

揭秘被忽视的商业模式:全民拼购助力客户实现日销千万的惊人业绩

今天,我想和大家分享一个颇具潜力的模式与玩法,尽管它在外界看来可能略显陈旧。这个模式曾被忽视,但我的一位客户却巧妙运用,实现了惊人的业绩——日销售额接近五千万,日订单量高达300万单。 值得注意的是,…

一键搞定COX回归亚组森林图!快速生成顶级SCI论文的高清图!

现在亚组分析好像越来越流行,无论是观察性研究还是RCT研究,亚组分析一般配备森林图。 比如NEJM这张图: 比如Lancet这张图: 但是在使用R语言绘制时,简单的代码画不出好看的图,好看的图又需要许多代码参数来进…
最新文章