基于FPGA的数字信号处理(16)--定点数的舍入模式(7)6种舍入模式的总结

news2024/9/29 17:35:28

前言

        在前面的6篇文章中,分别对6中舍入模式做了详细的介绍,本文在前文的基础上,再对这6种舍入模式做一个对比和总结。

6种舍入模式

        在数据处理过程中,为了防止数据溢出而增加位宽是一种很常见的处理方式,但是随着算法链的深入,如果任由位宽无限度地增长的话,就是导致使用资源爆炸。所以为了防止这种情况的出现,我们需要对数据的位宽做一定的截位处理,即舍入。

        四舍五入就是一种最常见的舍入方式,除次之外,还有以下几种:

  • round:即四舍五入,它的舍入方式是舍入到最近的整数,在0.5这类往两边距离都一致的情况时,正数向上取整,而负数则向下取整。例如round(0.5) =1;round(-0.5) =-1

  • nearest:另一种形式的“四舍五入”,与round一样,也是舍入到最近的整数,但在对0.5这类情况时,它是不管正负,都是向上取整,例如nearest(0.5) =1;nearest(-0.5) = 0

  • convergent:另一种形式的“四舍五入”,与round一样,也是舍入到最近的整数,但在对0.5这类情况时,它是不管正负,都舍入到最近的偶数,例如convergent(0.5) =0;convergent(1.5) = 2;convergent(-0.5) =0;convergent(-1.5)=-2 ;

  • floor:向下取整,即所有数都向着负无穷的方向,就近舍入到最近的整数,例如floor(0.25)=0;floor(1.5)=1;floor(-0.75)= -1;floor(-1.25)= -2;

  • ceil:向上取整,即所有数都向着正无穷的方向,就近舍入到最近的整数,例如ceil(0.25)= 1;ceil(1.5)=2;ceil(-0.75)= 0;ceil(-1.25)= -1;

  • fix:向0取整,所有数都向着0的方向,即正数向着负无穷的方向(floor),负数向着正无穷的方向(ceil),就近舍入到最近的整数。例如fix(0.25)= 0;fix(1.5)=1;fix(-0.75)= 0;fix(-1.25)= -1;

偏置与误差

        以上6种模式可以分为2类:

  • round、nearest、convergent:都是舍入到最近的整数,只是对中间数的处理方式不同。

  • floor、ceil、fix:都是向某一个方向取整。

        由于舍入方式的不同,所以带来的偏置和误差也不相同:

  • round:都是舍入的最近的整数,所以误差最多只有分辨率的一半。例如舍入到小数点后1bit,那么分辨率为0.5,误差最大的情况就是0.75到1这类情况。因为对于正的中间数而言相当于向上取整,对于负的中间数相当于向下取整。所以当数据是负样本时,由于round的处理,会带来一部分的负偏置;当数据是正样本时,由于round的处理,会带来一部分的正偏置;对于数据分布均匀的正值和负值样本时,则无偏置。

  • nearest:同上,误差最多也只有分辨率的一半。因为中间数都是向上取整,所以不管是正值样本还是负值样本,它都是有正的偏置。

  • convergent:同上,误差最多也只有分辨率的一半。因为中间数是舍入到最近的偶数,相当于一般向上取整,一半向下取整,所以它没有偏置。

  • floor:向下取整,正数相当于舍弃小数位;负数相当于舍弃小数位后再减1。误差最大为接近分辨率的值。例如保留1位小数,x.111111111····11(假设它位宽非常长),向下取整就是x.1,舍弃的部分为0.0111111111····11,这个数是无限接近分辨率的,即0.1(0.5)。向下取整相当于全部添加1个负方向的偏置。

  • ceil:向上取整,正数相当于舍弃小数位+1;负数相当于舍弃小数位。误差最大为接近分辨率的值。例如保留1位小数,x.00000000·····1(假设它位宽非常长),向上取整就是x+0.1,舍弃的部分为x+0.1-x.00000000····1=0.0111111111····11,这个数是无限接近分辨率的,即0.1(0.5)。向上取整相当于全部添加1个正方向的偏置。

  • fix:向0取整。正数相当于向下取整,即舍弃小数位;负数相当于向上取整,也相当于舍弃小数位。误差同上,为一个接近分辨率的值。它的偏置和round的情况恰恰相反,正数是具有负方向的偏置,而负数则是具有正方向的偏置,当样本是在正值和负值之间均匀分别是,它没有偏置。

溢出情况

        由于不同舍入模式可以存在进位的情况,所以可能会发生溢出。首先需要说明的,在定点数的舍入中,由于定点数表示的负数范围要比正数的范围大,所以只会产生正方向的溢出而不会产生负方向的溢出。

        例如Q4.2格式范围是-2~1.75,存在1.5/1.75舍入到2的情况,因为Q4.2格式无法表示2,所以发生了溢出;而负数方向的舍入最多就是到-2,所以都可以被正确表示,不会发生溢出。

        据此可以推断,上述6种舍入模式中,只要存在向上舍入情况的都有可能发生溢出,它们是:

  • round:大于等于一半时会向上舍入,所以可能会发生溢出

  • nearest:同上

  • convergent:同上

  • ceil:自身就是向上取整,所以会有可能发生溢出

        剩下的floor和fix它们的正数都是向下取整,所以不会发生溢出现象。

硬件开销

        不同的舍入方式对误差的影响是不一样的,有些的误差大,有些的误差小,是不是误差小的舍入方法就一定很好呢?不是,还是要综合考量硬件开销等因素。比如向下取整floor,只需要丢掉小数部分(或者约定的精度外部分)就可以了,这在硬件上就只需要重新连一下线就可以了,逻辑资源的开销就是0。而round这些方式虽然带来的误差小,但是要做的逻辑判断也多,所以硬件资源消耗也高。

        floor:只要丢掉小数部分(或者约定的精度外部分),相当于重连线,硬件开销很小(可以说是0开销)

image-20240421154533790

        ceil:向上取整,因为丢掉小数部分相当于向下取整,所以向上取整只需要丢掉小数部分,然后加1。特殊情况是整数的情况,此时的向上取整值就是其自身,所以丢掉小数部分后加的不是1而是0。所以硬件开销需要1个加法器来做加法,还需要一个电路来判断是否为整数(即小数部分是否为全0),该电路的输出可以直接用作加法器的一个输入

image-20240421154525056

        fix:向0取整,相当于正数floor,负数ceil。因为正数丢掉小数部分相当于向下取整,负数丢掉小数部分是向上取整,所以正数是丢掉小数部分然后加0;负数则是丢掉小数部分然后+1。特殊情况是整数的情况,此时的取整值就是其自身,所以丢掉小数部分后加的不是1而是0。综合起来就是负的非整数是丢掉小数部分然后加1;其他情况则是丢掉小数部分然后加0。所以硬件开销需要1个加法器来做加法,还需要一个电路来判断是否为负的非整数(即小数部分是否为全0以及符号位为1),该电路的输出可以直接用作加法器的一个输入。

image-20240421154545569

        round:在前面文章我们分析过了,是一个正数时,相当于舍弃小数部分然后加上小数部分的最高位;是一个负数,且小数部分的最高位为1和其他位不为全0时,相当于舍弃小数部分然后加上1,否则是于舍弃小数部分然后加上0。所以硬件开销是一个判断是否最高位为1和其他位不为全0的电路,一个MUX来选择进位值,一个加法电路实现整数部分加上进位值。

image-20240421161504992

        nearest:在前面文章我们分析过了,当小数部分的最高位为0时,相当于整数部分 + 进位值,进位值等于0,即小数部分的最高位;当小数部分的最高位为1时,相当于整数部分 + 进位值,进位值等于1,即小数部分的最高位。综合起来就是,直接用整数部分+小数部分的最高位。所以硬件开销只需要一个加法器。

image-20240421160534835

        convergent:在前面文章我们分析过了,当小数部分的最高位为1且其他位为全0时,相当于整数部分 + 进位值,进位值等于整数部分的最低位;情况情况相当于整数部分 + 进位值,进位值等于小数部分的最高位。所以硬件开销是一个判断是否最高位为1和其他位为全0的电路,一个MUX来选择进位值,一个加法电路实现整数部分加上进位值。

image-20240421161620178

        当然了,以上电路开销仅仅是简单情况下的示意图,随着位宽的增加,不同模式的硬件开销是可能存在区别的,但是大趋势应该不会变。

总结

        综合以上舍入模式的方法、偏置、误差、溢出、电路开销等,总结如下:

2024-04-20_121614

 

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

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

相关文章

保姆级教程:Linux (Ubuntu) 部署流光卡片开源 API

流光卡片 API 开源地址 Github:https://github.com/ygh3279799773/streamer-card 流光卡片 API 开源地址 Gitee:https://gitee.com/y-gh/streamer-card 流光卡片在线使用地址:https://fireflycard.shushiai.com/ 等等,你说你不…

CVE-2024-6387Open SSH漏洞彻底解决举措(含踩坑内容)

一、漏洞名称 OpenSSH 远程代码执行漏洞(CVE-2024-6387) 二、漏洞概述 Open SSH是基于SSH协议的安全网络通信工具,广泛应用于远程服务器管理、加密文件传输、端口转发、远程控制等多个领域。近日被爆出存在一个远程代码执行漏洞,由于Open SSH服务器端…

记录|C#安装+HslCommunication安装

记录线索 前言一、C#安装1.社区版下载2.VS2022界面设置 二、HslCommunication安装1.前提2.安装3.相关文件【重点】 更新记录 前言 初心是为了下次到新的电脑上安装VS2022做C#上机位项目时能快速安装成功。 一、C#安装 1.社区版下载 Step1. 直接点击VS2022,跳转下…

项目实战--Spring Boot + GraphQL实现实时数据推送

背景 用户体验不断提升而3对实时数据的需求日益增长,传统的数据获取方式无法满足实时数据的即时性和个性化需求。 GraphQL作为新兴的API查询语言,提供更加灵活、高效的数据获取方案。结合Spring Boot作为后端框架,利用GraphQL实现实时数据推…

【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——粗配准

【GeoTransformer系列】——粗配准 1.coarse_matching1.1 概要1.2 功能1.3 超参1.4 input1.5 output2 coarse_target2.1 概要2.2 功能2.3 input2.4 output在模型部分有了初步了解之后, 接下来我们对后续的粗配准、精配准等部分依次进行解读. 本篇主要来看粗配准部分, 代码是在G…

叉车防撞系统:揭秘其多样化工作模式

叉车,作为物流仓储领域的重要工具,其安全性一直备受关注。随着科技的进步,叉车防撞系统应运而生,成为了叉车驾驶员的得力助手。那么,叉车防撞系统究竟是如何实现其安全防护的呢?让我们一同揭开,…

必看 | 最简单获取IP地址专用SSL证书的申请方法

申请IP地址专用的SSL证书并不像传统SSL证书那样普及,不是所有服务商都提供IP地址的SSL证书,因此需要仔细选择合适的服务商和流程进行操作申请,以此来实现IP地址访问的https。以下是最简单的IP地址专用SSL证书申请方法: 一、准备 …

YOLOv10改进 | 损失函数篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

一、本文介绍 本文给大家带来的是YOLOv10最新改进,为大家带来最近新提出的InnerIoU的内容同时用Inner的思想结合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等损失函数,形成 InnerIoU、InnerSIoU、InnerWIoU、等新版本损失函数,同时还结合了Focus和…

nprogress进度条插件

打开一个页面时,往往会伴随一些请求,并且会在页面上方出现进度条。它的原理时,在我们发起请求的时候开启进度条,在请求成功后关闭进度条,所以只需要在request.js中进行配置。 如下图所示,我们页面加载时发起…

一套完善的孕产妇保健信息化管理平台源码:管理了孕妇从怀孕开始到生产结束42天以内的一系列医院保健服务信息

数字化产科管理平台源码,智慧产科系统源码,采用java语言开发,前端框架为Vue,ElementUIMySQL数据库,前后端分离架构的数字化产科管理系统源码,自主版权,多个大型综合医院、妇幼保健院应用案例&am…

小米恢复联系人,跟着这2个步骤,让你的社交重回巅峰

当你突然发现小米手机里的联系人列表变得空空如也,是不是感觉就像失去了与外界沟通的“秘密武器”?别担心,这并不意味着你真的失去了他们。他们可能只是藏在了手机里的某个神秘角落,等待着你的召唤。接下来,小编将会介…

Redis实战—秒杀优化(Redis消息队列)

回顾 我们回顾一下前文下单的流程,当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤。 1、查询优惠卷 2、判断秒杀库存是否足够 …

基于STM32的智能加湿器

1.简介 基于STM32的加湿器发展前景非常乐观,这主要得益于其在技术、市场需求、应用场景以及政策支持等多方面的优势。STM32微控制器具备强大的处理能力和丰富的外设接口,能够实现精确的湿度监测和智能化控制。基于STM32的加湿器可以根据环境湿度自动调节…

如何在 Windows 10 上恢复未保存的 Word 文档

您是否整晚都在处理一个重要的 word 文件,但忘记保存它了?本文适合您。在这里,我们将解释如何恢复未保存的 word 文档。除此之外,您还将学习如何恢复已删除的 word 文档。 从专业人士到高中生,每个人都了解丢失重要 W…

亚信安全新一代终端安全TrustOne2024年重磅升级

以极简新主义为核心,亚信安全新一代终端安全TrustOne自2023年发布以来,带动了数字化终端安全的革新。60%,安装部署及管理效率的提升;50%,安全管理资源的节省;100%,信创非信创场景的全覆盖。Trus…

强化学习实战1:OpenAI Gym 实验环境介绍

环境配置 我的 torch 版本是 2.3.0,然后 gym 版本是 0.22.0,python 版本是 3.8 ,pygame 版本是 2.6.0 。 首先安装一下 gym: pip install gym0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple然后安装一下 pygame&#xff…

Nifi内置处理器Processor的开发

Nifi-Processor自定义开发的流程 之前说过,大部分的数据处理,我们可以基于ExcuseGroovyScript处理器,编写Groovy脚本去完成(或者Jpython,Js脚本等对应的组件),只能说这是基于Nifi平台的使用层面…

Mxnet转Onnx 踩坑记录

0. 前言 使用将MXNET模型转换为ONNX的过程中有很多算子不兼容,在此对那些不兼容的算子替换。在此之前需要安装mxnet分支v1.x版本作为mx2onnx的工具,git地址如下: mxnet/python/mxnet/onnx at v1.x apache/mxnet GitHub 同时还参考了如下…

李良济“小儿推拿妈妈班”圆满结课,以中医智慧守护儿童健康成长!

孩子生场病,妈妈半条命!作为妈妈最害怕的就是孩子生病,自己又无能为力! 为了帮助妈妈们,正确应对孩子健康问题,日常生活中科学帮助孩子提升体质少生病! 参加此次课程的,不仅有妈妈&a…

8.7结构体const使用场景

代码 #include <iostream> using namespace std; #include <string>//const使用场景//定义学生结构体 struct student {string name;int age;int score; };//将函数中的形参改为指针&#xff0c;可以减少内存空间&#xff0c;而且不会复制出新的副本 void printSt…