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

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&#xff1a;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&#xff0c;1.1010…...

小型养猫空气净化器怎么选?小型养猫空气净化器产品评测

家养四只猫猫&#xff0c;对于各个角落的猫毛&#xff0c;感觉家里已经被猫毛占领了。感受一下40度高温的养猫人&#xff0c;给掉毛怪疏毛浮毛飘飘&#xff0c;逃不过的饮水机&#xff0c;各个角落&#xff0c;多猫拉臭传来的异味。 一、养猫带来的麻烦 掉毛&#xff1a;每到换…...

数学建模--二分法

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

如何使用 Puppeteer 绕过 Akamai

摘要&#xff1a; 本文深入探讨了在面对Akamai强大防护下的网页抓取挑战时&#xff0c;如何运用Puppeteer这一强大的Node.js库&#xff0c;通过模拟真实用户行为、动态请求处理等策略&#xff0c;高效且隐蔽地收集数据。我们将一步步揭开Puppeteer绕过Akamai的神秘面纱&#x…...

【硬件知识】车规级开发等级——AEQ-100和ISO26262标准

文章目录 一、定义二、区别1.应用场景2.使用方法 总结 一、定义 AEQ-100&#xff08;Automotive Electronics Council Q100&#xff09;是一个由汽车电子委员会&#xff08;AEC&#xff09;制定的标准&#xff0c;主要用于保证汽车电子元件的可靠性。它是一个关于汽车级半导体…...

Qt | QStackedBarSeries(堆叠条形图)+QPercentBarSeries(堆叠百分比条形图)

点击上方"蓝字"关注我们 01、QBarSet 1. 首先,需要创建一个名为QBarSet的类。 2. 在QBarSet类中,定义所需的属性和方法。 3. 属性可能包括条形的名称、颜色、值等。 4. 方法可能包括添加条形、删除条形、计算总和等。 5. 确保QBarSet类能够与QBar类协同工作,…...

C++——多态经典案例(一)组装电脑

案例&#xff1a;小明打算买两台组装电脑&#xff0c;假设电脑零部件包括CPU、GPU和内存组成。 一台电脑使用intel的CPU、GPU和内存条 一台电脑使用Huawei的CPU、GPU和Intel的内存条 分析&#xff1a;使用多态进行实现 将CPU、GPU和内存条定义为抽象类&#xff0c;内部分别定义…...

从传统监控到智能化升级:EasyCVR视频汇聚平台的一站式解决方案

随着科技的飞速发展和社会的不断进步&#xff0c;视频监控已经成为现代社会治安防控、企业管理等场景安全管理中不可或缺的一部分。而在视频监控领域&#xff0c;EasyCVR视频汇聚平台凭借其强大的多协议接入能力&#xff0c;在复杂多变的网络环境中展现出了卓越的性能和广泛的应…...

Windows下,已知程序PID,取得其窗口句柄HWND

我需要实现这么一个功能&#xff1a;在知道某个程序的PID的情况下&#xff0c;最大化并且置顶显示这个程序的窗口。经过一番资料的查找&#xff0c;并且借助了一些科技的力量&#xff0c;找到了解决办法&#xff1a; struct FindWindowData {DWORD processId;HWND hWnd; };BOO…...

Java获取exe文件详细信息:产品名称,产品版本等

使用Maven项目&#xff0c;在pom.xml文件中注入&#xff1a; <dependency><groupId>com.kichik.pecoff4j</groupId><artifactId>pecoff4j</artifactId><version>0.4.1</version></dependency> 程序代码&#xff1a; import …...

ORB-SLAM2运行环境搭建

操作系统&#xff1a;Ubuntu20.04 1.安装Eigen3 推荐大家安装版本 3.2.10 链接&#xff1a;https://eigen.tuxfamily.org/index.php?titleMain_Page mkdir build cd build cmake .. sudo make install2.安装Pangolin 推荐安装0.5版本 链接&#xff1a;https://github.com…...

Nginx高频核心面试题2

目录 高级问题1. **Nginx中如何实现URL重写&#xff1f;**2. **如何在Nginx中设置基本的HTTP身份验证&#xff1f;**3. **如何限制Nginx中的请求速率&#xff1f;**4. **如何在Nginx中设置自定义错误页面&#xff1f;**5. **Nginx的worker_processes和worker_connections参数有…...

全面提升PDF编辑效率,2024年五大顶级PDF编辑器推荐!

在这个数字化飞速发展的时代&#xff0c;PDF文件已经成为我们日常工作和学习中不可或缺的一部分。然而&#xff0c;面对PDF文件的编辑和管理&#xff0c;许多人仍然感到困惑和无助。今天&#xff0c;就让我们一起探索几款高效、易用的PDF编辑器&#xff0c;它们将彻底改变你的工…...

代码随想录算法训练营第二十天|235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

写在前边的话 235. 二叉搜索树的最近公共祖先 题目链接 力扣题目链接 题目难度 中等 看到题目的第一想法 看到题目的第一想法&#xff0c;除了昨天做过的普通二叉树的最近祖先的解法利用回溯从底向上搜索&#xff0c;我会想到使用迭代法&#xff0c;但我好像不太会使用到二…...

视频美颜SDK与直播美颜插件在实时视频中的应用

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

【Linux】yum(工具篇)

文章目录 前言&#xff1a;什么是软件包yum 的介绍yum源yum源的配置第三方源的配置官方源的配置镜像站点安装wget包备份本地yum源配置网易yum源重新生成yum缓存 前言&#xff1a;什么是软件包 在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这个参数&#xff0c;那么这个参数代表什么意思&#xff0c;不同的值会产生什么影响呢&#xff0c;详见下文。 行字节数的计算 理解内存对齐之前首先要…...

手机号码归属地查询接口如何对接?(一)

一、什么是手机号码归属地接口&#xff1f; 通过手机号查询归属地信息、是否虚拟运营商等。 二、手机号码归属地接口适用哪些场景&#xff1f; 例如&#xff1a;市场营销领域 &#xff08;1&#xff09;精准营销&#xff1a;企业可以通过手机号归属地查询接口了解客户的大致…...

DDei在线设计器-加载数据

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

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...