float32转float16、snorm/sunorm8/16 学习及实现
1、基础
彻底搞懂float16与float32的计算方式-CSDN博客
例1:float32 0x3fd00000 = 32'b0 011_1111 _1 101_0000_0000_0000_0000_0000
sign=0
exp=8'b0111_1111 = 'h7f = 'd127 =>0ffset = 127-127 = 0
mantissa = 'b101_0000_0000_0000_0000_0000(补1,1.1010000....)
(-1)^sign * 2^exp_offset * mantissa = 1.101b = 2^0 + 2^(-1) + 2^(-3) = 1.625 d
例2: float32 0x3f200000 = 32'b0 011_1111 _0 010_0000_0000_0000_0000_0000
sign=0
exp=8'b0111_1110 = 'h7e = 'd127 =>0ffset = 126-127 = -1
mantissa = 'b010_0000_0000_0000_0000_0000(补1,1.0100000....)
(-1)^sign * 2^exp_offset * mantissa = 1.010 * 2^(-1) b = 0.101= 2^(-1) + 2^(-3) = 0.625 d
特殊情况,exp 全1时候的nan、inf,exp=0 时候的denorm / 0
DXGI FOMAT中的SNORM和 UNORM格式-CSDN博客
根据上面的理解,要实现的
snorm8 能够表示的数据为 int(-1.0 ,1.0)* 127 ;
unorm8 能够表示的数据为 int(0,1.0)*255;
snorm16 能够表示的数据为 int(-1.0 ,1.0)* (2^15-1);
unorm16 能够表示的数据为 int(0,1.0)*(2^16-1);
2、实现(sv)
function bit[31:0] float32_to_newformat(bit [31:0] float32_in, TRANSFORM_TYPE type);bit [31:0] rt_data_out;bit [7: 0] unorm8_out;bit [7: 0] snorm8_out;bit [15:0] float16_out;bit [15:0] unorm16_out;bit [15:0] snrom16_out;bit sign;bit [7: 0] exponent;bit [22:0] mantissa;bit [23:0] norm_mantissa;int exp_offset;bit [47:0] shifted_value;bit [7: 0] unorm8_value;bit [7: 0] snorm8_value;bit [15:0] unorm16_value;bit [15:0] snrom16_value;bit [4: 0] exp16;bit [9: 0] mant16;bit overflow,underflow,is_inf,is_nan;//note1sign = float32_in[31];exponent = float32_in[30:23];mantissa = float32_in[22:0];norm_mantissa = {1'b1,mantissa};if (type == UNORM8)beginif (exponent >=127)begin //note2.1if (exponent == 8'ff && mantissa != 0) //note2.1.1unorm8_value = 8'h0;else //note2.1.2unorm8_value = 8'hff;end else if (exponent >=118)begin //note2.2shifted_value = norm_mantissa[23:0] * 255;if (shifted_value[23+127-exponent-1] == 1) //note2.2.1unorm8_value = (shifted_value>>(23+127-exponent)) + 1;elseunorm8_value = shifted_value>>(23+127-exponent);end else //note2.3unorm8_value = 8'h0;unrom8_out = sign? 8'h0 : unorm8_value; //note2.4end else if (type == SNORM8)beginif (exponent >=127)begin if (exponent == 8'ff && mantissa != 0) snorm8_value = 8'h0;else snorm8_value = 8'h7f;end else if (exponent >=119)begin shifted_value = norm_mantissa[23:0] * 127;if (shifted_value[23+127-exponent-1] == 1) snorm8_value = (shifted_value>>(23+127-exponent)) + 1;elsesnorm8_value = shifted_value>>(23+127-exponent);end else snorm8_value = 8'h0;snrom8_out = sign? (-snorm8_value): snorm8_value; end else if (type == FLOAT16)beginexp_offset = exponent - 127 + 15;overflow = (exp_offset >= 31);underflow = (exp_offset <= 0);is_inf = (exponent = 8'hff && mantissa == 23'h0);is_nan = (exponent = 8'hff && mantissa != 23'h0);//note3.1exp16 = (overflow && exponent != 8'hff) ? 5'h1e :(is_inf | is_nan) ? 5'h1f :underflow ? 5'h0 : exp_offset[4:0];//note3.2mant16 = (overflow && exponent != 8'hff) ? 10'h3ff :is_inf ? 10'h0 :is_nan ? {1'b1,mantissa[21:13]}:underflow ?(mantissa == 23'h0 ? 10'h0 : norm_mantissa[23:13] >> (1-exp_offset)): mantissa[22:13];float16_out = {sign,exp16,mant16}; end else if (type == UNORM16)beginif (exponent >=127)begin if (exponent == 8'ff && mantissa != 0) unorm16_value = 16'h0;else unorm16_value = 16'hffff;end else if (exponent >=111)begin shifted_value = norm_mantissa[23:0] * 65535;if (shifted_value[23+127-exponent-1] == 1) unorm16_value = (shifted_value>>(23+127-exponent)) + 1;elseunorm16_value = shifted_value>>(23+127-exponent);end else unorm16_value = 16'h0;unrom16_out = sign? 16'h0: unorm16_value; end else if (tyep == SNORM16)beginif (exponent >=127)begin if (exponent == 8'ff && mantissa != 0) snorm16_value = 16'h0;else snorm16_value = 16'h7fff;end else if (exponent >=112)begin shifted_value = norm_mantissa[23:0] * 32767;if (shifted_value[23+127-exponent-1] == 1) snorm16_value = (shifted_value>>(23+127-exponent)) + 1;elsesnorm16_value = shifted_value>>(23+127-exponent);end else snorm16_value = 16'h0;snrom16_out = sign? (-snorm16_value): snorm8_value; endendfunction
3、代码说明
note1 float32 的拆分,1bit sign,8bit exp,23 bit尾数,补上舍去的1
note2.1 对于norm/snorm 来讲表示-1.0~1.0或者0~1.0 之间的数值,如果指数大于127表示offset 大于0,浮点数大于1了,可以直接设置为最大值
note2.1.1 但是对于 特殊情况,exp 为全1,且mantissa 不等于0 表示无效值,针对无效值赋值为0
note 2.1.2 对于unorm 不考虑符号,所以最大值为全1,对于snorm ,考虑符号位,最高位为0,其余为1
note2.2 对于unrom8,数值转换需要× 255,约2^8,exp>118 才有机会大于0,如果exp再小一些,等于0
note2.2.1 round
note 2.3 见 note2.2
note 2.4 unorm时,sign为1,表示负数,不在unorm表示范围,赋值为0,snorm时候,取负值
note 3.1 exp16转换时候的特殊情况:
overflow时且is_inf ,is_nan不成立,表示为能够表示的最大数(1f是特殊值,所以是1e)
is_inf,is_nan 成立时候exp16 全1,
underflow时为0,
其余取计算出来的exp_offset
note 3.2 mant16 转换时候的特殊情况:
overflow时且is_inf ,is_nan不成立,表示为能够表示的最大数
is_inf,时候根据定义mant16 应该为0,
is_nan 时候按道理取mant32 的高10位即可,但是防止高10位都为0的情况(这样会转换成is_inf),所以最高位强制为1(反正无效,哪一位强制都可以)
underflow时,如果mant32 为0 那就是0,否则要使用特殊公式
正常情况取mant32的高10位
其余取计算出来的exp_offset
相关文章:
float32转float16、snorm/sunorm8/16 学习及实现
1、基础 彻底搞懂float16与float32的计算方式-CSDN博客 例1:float32 0x3fd00000 32b0 011_1111 _1 101_0000_0000_0000_0000_0000 sign0 exp8b0111_1111 h7f d127 >0ffset 127-127 0 mantissa b101_0000_0000_0000_0000_0000(补1,1.1010…...

小型养猫空气净化器怎么选?小型养猫空气净化器产品评测
家养四只猫猫,对于各个角落的猫毛,感觉家里已经被猫毛占领了。感受一下40度高温的养猫人,给掉毛怪疏毛浮毛飘飘,逃不过的饮水机,各个角落,多猫拉臭传来的异味。 一、养猫带来的麻烦 掉毛:每到换…...

数学建模--二分法
目录 二分法的基本原理 应用实例 求解方程根 查找有序数组中的元素 注意事项 Python代码示例 编辑 延伸 二分法在数学建模中的具体应用案例有哪些? 如何选择二分法的初始区间以确保收敛速度和精度? 在使用二分法求解方程时,如何…...

如何使用 Puppeteer 绕过 Akamai
摘要: 本文深入探讨了在面对Akamai强大防护下的网页抓取挑战时,如何运用Puppeteer这一强大的Node.js库,通过模拟真实用户行为、动态请求处理等策略,高效且隐蔽地收集数据。我们将一步步揭开Puppeteer绕过Akamai的神秘面纱&#x…...
【硬件知识】车规级开发等级——AEQ-100和ISO26262标准
文章目录 一、定义二、区别1.应用场景2.使用方法 总结 一、定义 AEQ-100(Automotive Electronics Council Q100)是一个由汽车电子委员会(AEC)制定的标准,主要用于保证汽车电子元件的可靠性。它是一个关于汽车级半导体…...
Qt | QStackedBarSeries(堆叠条形图)+QPercentBarSeries(堆叠百分比条形图)
点击上方"蓝字"关注我们 01、QBarSet 1. 首先,需要创建一个名为QBarSet的类。 2. 在QBarSet类中,定义所需的属性和方法。 3. 属性可能包括条形的名称、颜色、值等。 4. 方法可能包括添加条形、删除条形、计算总和等。 5. 确保QBarSet类能够与QBar类协同工作,…...

C++——多态经典案例(一)组装电脑
案例:小明打算买两台组装电脑,假设电脑零部件包括CPU、GPU和内存组成。 一台电脑使用intel的CPU、GPU和内存条 一台电脑使用Huawei的CPU、GPU和Intel的内存条 分析:使用多态进行实现 将CPU、GPU和内存条定义为抽象类,内部分别定义…...

从传统监控到智能化升级:EasyCVR视频汇聚平台的一站式解决方案
随着科技的飞速发展和社会的不断进步,视频监控已经成为现代社会治安防控、企业管理等场景安全管理中不可或缺的一部分。而在视频监控领域,EasyCVR视频汇聚平台凭借其强大的多协议接入能力,在复杂多变的网络环境中展现出了卓越的性能和广泛的应…...
Windows下,已知程序PID,取得其窗口句柄HWND
我需要实现这么一个功能:在知道某个程序的PID的情况下,最大化并且置顶显示这个程序的窗口。经过一番资料的查找,并且借助了一些科技的力量,找到了解决办法: struct FindWindowData {DWORD processId;HWND hWnd; };BOO…...

Java获取exe文件详细信息:产品名称,产品版本等
使用Maven项目,在pom.xml文件中注入: <dependency><groupId>com.kichik.pecoff4j</groupId><artifactId>pecoff4j</artifactId><version>0.4.1</version></dependency> 程序代码: import …...

ORB-SLAM2运行环境搭建
操作系统:Ubuntu20.04 1.安装Eigen3 推荐大家安装版本 3.2.10 链接:https://eigen.tuxfamily.org/index.php?titleMain_Page mkdir build cd build cmake .. sudo make install2.安装Pangolin 推荐安装0.5版本 链接:https://github.com…...
Nginx高频核心面试题2
目录 高级问题1. **Nginx中如何实现URL重写?**2. **如何在Nginx中设置基本的HTTP身份验证?**3. **如何限制Nginx中的请求速率?**4. **如何在Nginx中设置自定义错误页面?**5. **Nginx的worker_processes和worker_connections参数有…...

全面提升PDF编辑效率,2024年五大顶级PDF编辑器推荐!
在这个数字化飞速发展的时代,PDF文件已经成为我们日常工作和学习中不可或缺的一部分。然而,面对PDF文件的编辑和管理,许多人仍然感到困惑和无助。今天,就让我们一起探索几款高效、易用的PDF编辑器,它们将彻底改变你的工…...
代码随想录算法训练营第二十天|235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
写在前边的话 235. 二叉搜索树的最近公共祖先 题目链接 力扣题目链接 题目难度 中等 看到题目的第一想法 看到题目的第一想法,除了昨天做过的普通二叉树的最近祖先的解法利用回溯从底向上搜索,我会想到使用迭代法,但我好像不太会使用到二…...

视频美颜SDK与直播美颜插件在实时视频中的应用
视频美颜技术作为提升视频质量的重要手段,已经成为了许多视频和直播应用中不可或缺的一部分。本篇文章,笔者将探讨视频美颜SDK与直播美颜插件在实时视频中的应用,并分析其在用户体验和技术实现方面的重要性。 一、视频美颜SDK的应用场景 视…...

【Linux】yum(工具篇)
文章目录 前言:什么是软件包yum 的介绍yum源yum源的配置第三方源的配置官方源的配置镜像站点安装wget包备份本地yum源配置网易yum源重新生成yum缓存 前言:什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程…...

3GPP入门
官网地址 3GPP – The Mobile Broadband Standard 协议下载链接 Directory Listing /ftp/specs/archive 总纲 重点series Signalling protocols ("stage 3") - user equipment to network24 series信令Radio aspects25 series3G 基础LTE (Evolved UTRA), LTE-Adva…...
FFmpeg内存对齐简述
目录 引文 行字节数的计算 ffmpeg中的align ffmpeg中的linesize 内容参考 引文 在ffmpeg的使用过程中有时会发现align这个参数,那么这个参数代表什么意思,不同的值会产生什么影响呢,详见下文。 行字节数的计算 理解内存对齐之前首先要…...
手机号码归属地查询接口如何对接?(一)
一、什么是手机号码归属地接口? 通过手机号查询归属地信息、是否虚拟运营商等。 二、手机号码归属地接口适用哪些场景? 例如:市场营销领域 (1)精准营销:企业可以通过手机号归属地查询接口了解客户的大致…...

DDei在线设计器-加载数据
加载数据 本示例演示了怎样加载已有的JSON到设计器中。 如需了解详细的API教程以及参数说明,请参考DDei文档 外部数据JSON demo.vue <script setup lang"ts"> import DDeiEditorView from "ddei-editor"; import { DDeiCoreStandLayou…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...

MySQL 数据库深度剖析:事务、SQL 优化、索引与 Buffer Pool
在当今数据驱动的时代,数据库作为数据存储与管理的核心,其性能与可靠性至关重要。MySQL 作为一款广泛使用的开源数据库,在众多应用场景中发挥着关键作用。在这篇博客中,我将围绕 MySQL 数据库的核心知识展开,涵盖事务及…...
Qt Quick模块功能及架构
Qt 6.0 中的 Qt Quick 模块是构建现代、动态用户界面的核心框架,基于声明式编程(QML)和 JavaScript,专注于高性能、流畅的动画和跨平台 UI 开发。、 一、主要功能改进 1. Qt Quick 核心架构 QML 引擎升级:Qt 6.0 使用…...
python打卡第48天
知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 **…...