单精度、半精度之间的转换,及半精度加法实现

单精度浮点存储方式

1位符号位s+8位指数位e+23位尾数位f,共32位,内存占4个字节,表示方式为(-1)^s * 2 ^(e - 127) * 1.f
在这里插入图片描述

半精度浮点存储方式

1位符号位+5位指数位+10位尾数位,共16位,内存占2个字节,表示方式为(-1)^s * 2 ^(e - 15) * 1.f
在这里插入图片描述

C语言不包含半精度数据类型,但是只要知道f32在内存中存储占4个字节,f16占两个字节,就可以自己重定义f16数据类型来实现

单精度转换为半精度

以3.333333为例,转换为半精度为3.33

将浮点数转换为4字节16进制,依次获取f32符号位,f32指数位,f32尾数位

【实现步骤】

  • 转换为二进制:11.01010101010101010101010101…
  • 小数点需要往左移1位,所以是2^1次方
  • 二进制科学计数法为:1.10101010101010101010101 * 2^1

f32符号位:0
f32指数位:1+127 = 128 二进制表示:1000 0000
f32尾数位: 1010 1010 1010 1010 1010 101

f32内存表示为 0 1000 0000 1010 1010 1010 1010 1010 101即0x40555555

获取f16符号位,f16指数位,f16尾数位

【实现步骤】

  1. 符号位
    符号位保持和单精度一致,3.333333为正,f16符号位 = f32符号位 = 0
  2. 指数位
    f32指数 - 127 = f16指数 - 15 ==>f16指数 = f32指数 - 127 + 15
    f16指数= 16, 二进制表示为1 0000
  3. 尾数位
    23位f32尾数,截取前10位作为f16尾数(精度丢失)
    f16尾数: 1010 1010 10

f16内存表示为 0 10000 1010 1010 10 即0x42aa

半精度转换为单精度

转换方式就是单精度转半精度的逆过程
以3.33为例,转换为单精度为3.330000(最后4位随机)

将浮点数转换为2字节16进制,依次获取f16符号位,f16指数位,f16尾数位

【实现步骤】

  • 转换为二进制:11.0101 0101 01…
  • 小数点需要往左移1位,所以是2^1次方
    二进制科学计数法为1.1010 1010 101 * 2^1

f16符号位:0
f16指数位:1+15 = 16 二进制表示为:1 0000
f16尾数位: 1010 1010 10

f16内存表示为 0 1 0000 1010 1010 10即0x42aa

获取f32符号位,f32指数位,f32尾数位
【实现步骤】

  1. 符号位
    符号位保持和单精度一致,3.33为正,f32符号位 = f16符号位 = 0
  2. 指数位
    f16指数 - 15 = f32指数 - 127 ==>f32指数 = f16指数 - 15 + 127
    f32指数= 128, 二进制表示为1000 0000
  3. 尾数位
    10位f16尾数,后面补13个0,补足23位
    f32尾数: 1010 1010 1000 0000 000

f32内存表示为 0 1000 0000 1010 1010 1000 0000 000 即0x40554000,从内存读取出来时直接强制转换成float即可
在这里插入图片描述
在这里插入图片描述

【注】

  1. 尾数决定有效数字的位数,即精度;指数决定范围。因此单精度转换为半精度时会丢失精度,超过半精度范围的单精度转换会溢出,程序中要做好处理( float尾数位23位,2^23=8.3E6,7位,不同的编译器规定不同,有些是7位,有些8位)

  2. 当指数和尾数全为0时,计算机把它看做表示数字0;当指数全为1,尾数全为0时,符号位为0表示正无穷,符号位为1表示负无穷;当指数全为1,尾数不全为0时,无法表示。

  3. 因此在用浮点表示时,指数不能全为1或者全为0。float指数位为8位,取值范围为-128 ~ 127,实际使用范围是[-127, 0) && (0, 127];因为指数是以无符号形式存储的,因此指数的偏差为其可能值的一半。对于 float 类型,偏差为 127,f16就是15;存储指数值减去偏差值就是实际二进制科学记数法的指数值。
    代码包下载地址
    【fp16补充】
    正无穷:符号位为0,指数位全为1,尾数位全为0, 0 11111 0000000000
    负无穷:符号位为1,指数位全为1,尾数位全为0, 1 11111 0000000000
    零(包括正零和负零):指数,尾数全为0,0 00000 0000000000,1 00000 0000000000
    NAN:指数全为1,尾数非全0:0 11111 0000000001(自定义)

    【fp16能表示的数据范围】
    (-1)^s * 2 ^(e - 15) * 1.f
    = (-1)^s * 2 ^(30 - 15) * (1+1-2^-10)
    = (-1)^s * 2 ^(15) * (2-2^-10)
    = (-1)^s * 32768 * (2-2^-10)
    = -65504 ~ 65504

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
数学问题: 1.精度计算——大数阶乘 2.精度计算——乘法(大数乘小数) 3.精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换(FFT) 10.Ronberg算法计算积分 11.行列式计算 12.求排列组合数 13.求某一天星期几 字符串处理: 1.字符串替换 2.字符串查找 3.字符串截取 4.LCS—最大公共子串长度 5.LCS-生成最大公共子串 6.数字转化为字符 计算几何: 1.叉乘法求任意多边形面积 2.求三角形面积 3.两矢量间角度 4.两点距离(2D、3D) 5.射向法判断点是否在多边形内部 6.判断点是否在线段上 7.判断两线段是否相交 8.判断线段与直线是否相交 9.点到线段最短距离 10.求两直线的交点 11.判断一个封闭图形是凹集还是凸集 12.Graham扫描法寻找凸包 13.求两条线段的交点 数论: 1.x的二进制长度 2.返回x的二进制表示中从低到高的第i位 3.模取幂运算 4.求解模线性方程 5.求解模线性方程组(中国余数定理) 6.筛法素数产生器 7.判断一个数是否素数 8.求子距阵最大和 9.求一个数每一位之和 10.质因数分解 11.高斯消元法解线性方程组 图论: 1.Prim算法求最小生成树 2.Dijkstra算法求单源最短路径 3.Bellman-ford算法求单源最短路径 4.Floyd算法求每对节点间最短路径 5.解欧拉图 排序/查找: 1.快速排序 2.希尔排序 3.选择法排序 4.二分查找 高精度运算专题: 1.本专题公共函数说明 2.高精度比较 3.高精度加法 4.高精度减法 5.高精度乘10 6.高精度单精度 7.高精度乘高精度 8.高精度单精度 9.高精度除高精度
子工程学院综合课程设计(创新项目) 1.R、L、C元件参数到直流电压转换电路设计 设计思路:首先,利用运算放大器设计RLC参数—交流电压转换电路,后接峰值检波电 路和线性放大电路,得到直流电压。激励信号采用正弦波。 2.相位差至直流电压转换电路设计 设计思路:首先,设计一个能够产生0~359o相位差的两路同频信号(可采用RC移相网络 ); 将参考信号和移相后的信号进行相位比较,得到反映相位差的直流信号。 指标自定(信号频率要求不高,建议10kHz一下)。 3.精密V/F转换电路设计 思路:电压/频率转换(V/F转换)具有较好的精度、线性度和积分输入特性,便于远距 传 送模拟信号、光电隔离提高抗干扰性能,在低速高精度数据采集中得到广泛应用。 要求:模拟某传感器输出信号:0~20mV(可通过电位器调节得到),首先采用三运放结 构的仪用放大器(IA,可用三个OP07或单片集成如AD620)将信号放大到4V,再利用 V/F转换实现电压/频率转换,建议可用LM331,在此基础上可考虑增加一个由低 失调运算放大器(如LM308)组成的反向积分器,可大大改善线性度。 测试V/F转换的线性度,并计算最小二乘法拟合线性度。 4.触发电平可自动调节的频率测量的通道电路设计 思路:用正、负峰值检波电路取出信号的正、负峰值,再由分压电路对正、负峰值的差 值分压得到触发电平。 要求:通常,频率测量的通道电路多采用施密特触发器抑制被测输入频率信号中的干扰 ,但是,当输入信号动态范围较大时,希望触发电平能自动随输入信号幅度而调节 。 5.脉冲宽度测量与显示 思路:用2个双BCD加法计数器(如CD4518或74HC系列的也可),对基准时钟信号的计数 (根据分辨力要求,用100kHz即可),被测脉冲宽度信号作为计数器的闸门(计数 使能)信号。4位数码显示采用CD4511(7段锁存/译码/驱动器)驱动4个数码管。 要求:测量出脉冲宽度(考虑正脉冲宽度),分辨力10us,最大测量脉冲宽度99.99ms。 显示位数4位。 注意:脉冲宽度开始测量时计数器应清零,脉冲宽度结束时计数值要锁存。 6.频率合成的脉冲信号源设计 要求:输出频率1kHz~999kHz(可通过拨动开关设置),分辨力1kHz。 思路:采用高精度基准频率1kHz作为输入信号,分频式锁相环PLL采用CD4046,分频器采 用三位十进制计数器CD4522,计数器输入由三位拨动开关预置。 7. GPS软件接收机的设计与实现 8. WLAN中的协同定位方法 9. 分布式多点光照通风温度控制系统设计 10. 简易电阻、电容测试仪 11. 低频功率放大器 12. 洗衣机控制器,包括洗衣、清洗、脱水三个步骤。 13. 微波炉控制器,在0-1小时内时间任意设定。 14. 单运动站对目标定位跟踪的可行性研究 15. 基于单片机的无线倒车后视系统 16. 基于单片机的数控调频发射器 17. 基于单片机系统的无线遥控器 18. 基于单片机的近视预防报警器 19. 简易无线数据收发器 20. DSL主动匹配电路设计 21. 动态随机考试系统设计 22. C8051F系列MCU实验核心板设计 23. PIC系列MCU实验核心板设计 24. MSP430系列MCU实验核心板设计 25. 无线跟踪器设计 26. 多通信接口转换器设计 27. 智能地址译码器 28. 软件无线电实验系统设计 29. 建立模拟集成电路设计平台: 熟悉UNIX(LINEX)系统及EDA仿真器 30. 压控振荡器(VCO)设计: 学习和掌握VCO的原理。了解输入电压和谐振频率的关系。设计VCO及显示仿真结果 31. 锁相环(PLL)设计: 学习和掌握PLL系统的原理。设计PLL及显示仿真结果 32. Sigma-Delta 模数转换器(ADC)设计: 学习和掌握ADC和Sigma-Delta ADC系统的原理。设计Sigma-Delta ADC及显示仿真结果 33. Sigma-Delta 数模转换器(DAC)设计: 学习和掌握DAC和Sigma-Delta DAC系统的原理。设计Sigma-Delta DAC及显示仿真结果 34. 梳状滤波器的FPGA实现 35. 增益相位不平衡补偿的FPGA实现 36. 低通滤波器的设计、仿真与实现 37. QPSK数字调制及FPGA实现 38. 16QAM数字调制及FPGA实现 39. 发射机与接收机 制作一个调频发射机和调频接收机 基本要求: 发射频率范围:88MHz~108MHz; 发射功率 20mW; 调制信号:300Hz~3400Hz音频信号 在调制信号为1000Hz时,频偏不小于5kHz; 用接收机在5米内能正常接收; 40. 低频网络分析仪 测试频率:DC~10MHz 测试:阻抗、幅频特性、相频特性 4
IEEE 754是一种二进制浮点数算术标准,它定义了浮点数的表示方法、计算规则以及舍入方式。基于FPGA的IEEE 754加法运算器设计需要遵循以下步骤: 1. 确定数据宽度:IEEE 754标准定义了单精度和双精度浮点数,分别采用32位和64位表示。因此,需要确定设计的数据宽度,即采用32位还是64位。 2. 实现浮点数的表示:根据IEEE 754标准,浮点数的表示包括符号位、阶码和尾数。需要设计模块将输入的浮点数转换成符合IEEE 754标准的格式。 3. 实现加法器:加法器是实现浮点数加法的核心模块,需要设计一个高效的加法器。加法器的设计可以采用经典的加法器结构,如Ripple Carry Adder(RCA)或Carry Lookahead Adder(CLA)。 4. 实现舍入器:舍入器是将加法器的结果舍入到最接近的浮点数的一个关键模块。IEEE 754标准定义了四种舍入方式:向零舍入、向负无穷大舍入、向正无穷大舍入和最近偶数舍入。舍入器需要根据指定的舍入方式将加法器的结果舍入到正确的值。 5. 实现控制器:控制器是将各个模块连接起来的关键模块,需要设计一个控制器将输入的浮点数送到加法器中进行运算,并将结果输出。 6. 进行仿真和验证:设计完毕后,需要进行仿真和验证,以确保设计的正确性和可靠性。 以上就是基于FPGA的IEEE 754加法运算器的设计步骤,需要深入了解IEEE 754标准以及FPGA的设计原理和实现方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值