1、定点数:

顾名思义定点数就是小数位固定不变的数叫做定点数,也就是小数点是定在某个位置不变的数。

2、定点数的分类:

(1)定点整数:定点整数的小数点后面没有其他的数值,即小数点定在了数的最后面

定点整数又分为以下两类:

@@:无符号的定点整数:Unsigned fixed point integer,无符号定点整数没有符号位,所以它的全部数位都用来表示数字,且它的小数点隐含在最低位后,在它的二进制形式中不存在小数点(数在计算机中都是以二进制的形式进行存储的)。

对于某种数的表示方式,我们关心两点:

1.表示范围:这种方法表示数的大小(正负方向),无符号定点整数范围:0~2n-1

2.分辨率:精度,1(即最小非零正数)

                         二进制数:XnXn-1...X1X0表示无符号定点整数,则有n+1位正整数,它所代表的十进制数大小为:

例如8位无符号二进制数的表示范围为:00000000-11111111:0-255

@@:带符号定点整数

定义:带符号定点整数是纯整数,小数点在最低位之后,最高位为符号位,它与无符号定点整数的区别就是它的                                       最高位只用来指示符号,不代表实际数值,并且它在计算机中以而二进制的补码形式存储。

                          XnXn-1...X1X0表示无符号定点整数(假设是原码形式),则有n+1位正整数,它所代表的十进制数大小为:

最高位为0代表正数,最高位为1代表负数。

例如8位有符号二进制数的表示范围为:00000000-11111111:-128 到127

(2)有符号定点小数:

定点小数即纯小数(但好多博客都说小数的位数和正数的位数可以事先约定,那这样的话就不是纯小数了,这一点还有疑惑),小数点的位置固定在最高有效数位之前、符号位之后,如图1所示。定点小数的小数点位置是隐含约定的,小数点并不需要真正地占据一个bit。


                                                                      图1 定点小数格式
    当 Xs = 0 时,该小数为正值,其原码和补码表示的形式相同。

其中,

⑴ 绝对值最大的正小数为:

其实际值等于(通过移项及合并同类项,可知该等式成立):

⑵ 绝对值最小的正小数为:

其实际值等于:

以8bit数为例,最大正小数为 0.111 1111 = 1 - 2⁻⁷;最小正小数为 0.000 0001 = 2⁻⁷

当 Xs = 1 时,该小数为负值,有原码和补码两种表示形式(以下形式包含Xs位)。

⑴ 绝对值最大的负小数

① 原码表示

② 补码表示

⑵ 绝对值最小的负小数

① 原码表示

② 补码表示

可见,定点负小数的原码表示范围为: -(1 - 2⁻ⁿ) ~ -2⁻ⁿ;其补码表示范围为:-1 ~ -2⁻ⁿ。且n值越大,精度越高。

3.verilog中的定点小数

程序指定小数点的位置即为定标,有两种方法:Q表示方法和S表示方法。
(1) Q表示法:Qn表示低n位为小数,其余位为符号位和整数位。
(2) S表示法:Sn中低(15-n)为小数,其余位符号位和整数位。
在使用XILINX VIVADO 中的IP核,都是以Q表示法表示。

                    定点小数的表示范围:

              

其中N为定点数的位数(排除符号位),n为定标的位数,其中n越大则数据越精确,但表示的范围也会越小。

假设有一个16位的变量,设定小数占8位,那么它的精度为8位,那么它的精度是多少呢? 其实就是1/2^8=0.00390625.

(0.5,0.25,0.125,0.0625,0.03125,0.015625,0.0078125,0.00390625)

例如:reg [15:0] a=16'b0111_1011_1111_0000             它表示的定点小数为:31728/(2^8) = 123.9375也就是:

01111011.11110000的十进制数值

假设一个数2.3,它的二进制形式为10.0100110........后面有无穷多位;但约定好小数的位数为5位之后,则这个数就成为了2.28125,小数的位数越多。精度越高,越接近其真值;

那么我们假设x,x1,x2为实际小数,y1,y2,y3为定点小数,定位精度是n位,有如下关系

y1=y2+y3 <<=>>x1=x2+x3

y1=y2-y3 <<=>>x1=x2-x3

y1=y2/2^n*y3 <<=>>x1=x2*x3

y1=y2*2^n/y3 <<=>>x1=x2/x3

加减比较好理解,乘除为什么需要移位呢?以乘法为例子

y1=x1*2^n

y2*y3=x2*x3*x^2n                  ==>>y1*2^n=y2*y3 证毕

4.浮点数

      浮点数是一种 公式化 的表达方式,用来近似表示实数(浮点数也是实数),并且可以在表达范围和表示精度之间进行权衡(因此被称为浮点数)。

浮点数通常被表示为:

N=M×R^E

比如: 12.345=1.2345×10^1

其中,M(Mantissa)被称为浮点数的 尾数 ,R(Radix)被称为阶码的 基数 ,E(Exponent)被称为阶的 阶码 。计算机中一般规定R为2、8或16,是一个确定的常数,不需要在浮点数中明确表示出来。

因此,在已知标准下,要表示浮点数,

一是要给出尾数M的值,通常用定点小数形式表示(这里表示:纯小数),它决定了浮点数的表示精度,即可以给出的有效数字的位数。

二是要给出阶码,通常用定点整数形式表示,它指出的是小数点在数据中的位置,决定了浮点数的表示范围。因此,在计算机中,浮点数通常被表示成如下格式:(假定为32位浮点数,基为2,其中最高位为符号位)

32位浮点数:

64位浮点数:

浮点数的规格化表示

按照上面的指数表示方法,一个浮点数会有不同的表示:

0.3×10^0;0.03×10^1;0.003×10^2;0.0003×10^3;

为了提高数据的表示精度同时保证数据表示的唯一性,需要对浮点数做规格化处理。

在计算机内,对非0值的浮点数,要求尾数的绝对值必须大于基数的倒数,即|M|≥1/R。

即要求尾数域的最高有效位应为1,称满足这种表示要求的浮点数为规格化表示:把不满足这一表示要求的尾数,变成满足这一要求的尾数的操作过程,叫作浮点数的规格化处理,通过尾数移位和修改阶码实现。

比如,二进制原码的规格化数的表现形式:(0正1负)

正数 0.1xxxxxx

负数 1.1xxxxxx

为了提高数据的表示精度,当尾数的值不为0时,尾数域的最高有效位应为1,这称为浮点数的规格化表示。否则以修改阶码同时左右移动小数点位置的办法,使其变成规格化数的形式。

至此,我们引入IEEE754 标准,该标准约束了浮点数的大部分使用设置:(尾数用原码;阶码用“移码”;基为2)

在IEEE754标准中,一个规格化的32位浮点数x的真值表示为
x = (-1) ^s X(1.M)X 2^(E-127)
e = E - 127
其中尾数域所表示的值是1.M。由于规格化的浮点数的尾数域最左位(最高有效位)总是1,故这一位经常不予存储,而认为隐藏在小数点的左边。于是用23位字段可以存储24位有效数。(没有理解为啥这样)

64位的浮点数中符号位1位,阶码域11位,尾数域52位,植树偏移值是1023.因此规格化的64位浮点数x的真值为
x = (-1)s X(1.M)X 2^(E-1023)
e = E - 1023

总结如下:

(1) 尾数用原码,且隐藏尾数最高位。

原码非0值浮点数的尾数数值最高位必定为 1,因此可以忽略掉该位,这样用同样多的位数就能多存一位二进制数,有利于提高数据表示精度,称这种处理方案使用了隐藏位技术。当然,在取回这样的浮点数到运算器执行运算时,必须先恢复该隐藏位。

(2) 阶码使用“移码”,基固定为2

如下图的32bit浮点数和64bit浮点数,从最高位依次是符号位、阶码和尾数

于是,

一个规格化的32位浮点数x的真值为:

x=(−1)^s×(1.M)×2E^−127

一个规格化的64位浮点数x的真值为:

x=(−1)^s×(1.M)×2E^−1023

下面举一个32位单精度浮点数-3.75表示的例子帮助理解:

(1) 首先转化为2进制表示

−3.75=−(2+1+1/2+1/4)=−1.111×2^1

(2) 整理符号位并进行规格化表示

−1.111×2^1=(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^1

(3) 进行阶码的移码处理 
(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^1
 
=(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^(128−127)

于是,符号位S=1,尾数M为1110 0000 0000 0000 0000 000
阶码E为12810=1000 00002
,则最终的32位单精度浮点数为

1 1110 0000 0000 0000 0000 000 1000 0000

例题
1. 问题: 若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值。
解:将16进制数展开后,可得二进制数格式为

指数e=阶码-127=10000010-01111111=00000011=(3)10
包括隐藏位1的尾数1.M=1.011 0110 0000 0000 0000 0000=1.011011
于是有
x=(-1)^S X 1.M X 2^e=+(1.011011) X 2^3 = +1011.011=(11.375)10

2. 问题: 将数(20.59375)10转换成754标准的32位浮点数的二进制存储格式。
解:首先分别将整数和小数部分转换成二进制数:
20.59375 = 10100.10011
然后移动小数点,使其在第1、2位之间
10100.10011 = 1.010010011 X 2^4 e = 4
于是得到
S = 0, E = 4 + 127 = 131, M = 010010011
最后得到32位浮点数的二进制存储格式为
0100 0001 1010 0100 1100 0000 0000 0000 = (41A4C000)16

浮点数表示范围:

通过上面的规格化表示,我们可以很容易确定浮点数的表示范围:

既然有表示范围,那肯定也有不能表示的数值: 
首先来说明溢出值,如下图:

(1)无穷值:

如果指数E=11111111(2)=255(10)
且尾数M=0
,则根据符号位S分别表示+∞
和−∞
。因此,一个有效的32位浮点数其指数最大只能为254。

此外,无穷具有传递性,比如

(+∞) + (+7) = (+∞)

(+∞) × (−2) = (−∞)

(+∞) × 0 = NaN

(2)零值:

如果指数E=0
且尾数M=0
时,表示机器0.需要注意的是,这里的0也是有符号的,在数值比较的时候 +0=−0
; 但在一些特殊操作下,二者并不显相等,比如log(x), 1/+0≠1/−0。

此外,处于负下溢出和负上溢出之间的数值会被直接归为0。

(3)NAN:

如果E=0,且尾数M≠0,则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,如0/0, ∞×0, sqrt(−1);SNAN一般被用于标记未初始化的值,以此来捕获异常。

浮点数的表示精度

一般提到浮点数的精度(有效位数)的时候,总是会出现 float的有效位为6~7位, double的有效位为15~16位 。

下面以float为例,解释一下有效位数是怎样来的。

有效位数只和规格化浮点数的尾数部分有关,而尾数部分的位数是23位,因此我们首先列出下表

由上面的表格可以看出:

2^−23 和 2^−22 之间是存在间隔的,即0.0000001和0.0000002之间的小数我们是没有办法描述的,因此23位尾数最多只能描述到小数点后第7位;此外,我们通过四舍五入可以很容易发现0.0000003=0.0000004=2^−23+2^−22
, 这表明第7位有效数字只是部分准确。而第6位及之前的都是可以准确描述的,因此我们说float的有

以上内容只是网上内容的总结与整合,所以也不是原创;

https://blog.csdn.net/qq_43164708/article/details/105178210

https://www.cnblogs.com/Mayfly-nymph/p/11090241.html

https://blog.csdn.net/qq_43164708/article/details/105178210

verilog中的定点数、浮点数、定点小数、定点整数的表示及运算相关推荐

  1. 2.2.1 定点数的表示(无符号与有符号数、定点小数和整数、原码、反码、补码、移码)

    文章目录: 1.无符号数和有符号数 2.机器数的定点表示 (1)定点小数 (2)定点整数 3.原码.反码.补码.移码 1.无符号数和有符号数 无符号数:指整个机器字长的全部二进制位均为数值位,没有符号 ...

  2. 27,verilog中整数运算的位宽和符号规则

    注:学习.交流就在博主的个人weixin公众号 "FPGA动力联盟" 留言或直接+博主weixin "fpga_start" 私信~ 在verilog中,整数( ...

  3. C语言函数库定点数浮点数转换,定点数与浮点数的相互转换

    最近要写段数字运算的程序,因为从FPGA获取到的是定点数,15位数,最高位bit14是符号位,bit13是整数位,后面13位是小数位: 而我的运算过程都是用的浮点数,通过一系列计算后,还需要将计算的结 ...

  4. dsp处理浮点数_定点DSP如何做浮点运算

    许多DSP芯片只支持整数运算,如果现在这些芯片上进行小数运算的话,定点小数运算应该是最佳选择了,此外即使芯片支持浮点数,定点小数运算也是最佳的速度选择. 在DSP世界中,由于DSP芯片的限制,经常使用 ...

  5. matlab 二进制补码转十进制,MATLAB浮点数与定点二进制补码互转算法验证方案

    最近本人一直在学习ZYNQSOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQPS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更新硬 ...

  6. Verilog中基本的数据类型

    Verilog中共有19种数据类型. 基本的四种类型: reg型.wire型.integer型.parameter型. 其他类型:large型.medium型.small型.scalared型.tim ...

  7. verilog 中的 timescale

    原文链接:https://blog.csdn.net/qq_16923717/article/details/81099833 timescale 的语法 timescale 是 Verilog 中的 ...

  8. verilog中timescale

    1. `timescale `timescale是Verilog中的预编译指令,指定位于它后边的module的时间单位和时间精度,直到遇到新的`timescale指令或者`resetall指令.它的语 ...

  9. 【计算机组成原理 数字逻辑 Verilog】32位加法器的实现:支持整数的加减运算

    目录 0 前言 0.1 使用环境 0.2 知识点 0.3 注意事项 1 建模:1位加法器 1.1 构建基础模型 1.1.1 一位加法器 1.1.1.1 科技黑箱:外部端口与功能 1.1.1.2 揭秘黑 ...

最新文章

  1. Spark环境搭建(一)-----------HDFS分布式文件系统搭建
  2. java1.5连接oracle12c_java1.5连接oracle12c
  3. 《漫画算法2》源码整理-6 两数之和 三数之和
  4. 扎心了!年薪100万,却还不起5000块的信用卡
  5. leetcode 482. 密钥格式化(Java版)
  6. PHP 截取字符串乱码的解决方案
  7. JavaSE 学习笔记之正则表达式(二十五)
  8. 45:十进制到八进制
  9. C#/WPF学习笔记:起始
  10. 关于如何使用IfcRelAggregates来对IFC中的元素进行关联
  11. linux 大型c程序,c – 如何以编程方式在大型Linux应用程序中“拉网线”?
  12. LTE技术对PTN的影响
  13. JAVA+selenium+testNG QQ邮箱登录及邮箱发送
  14. 若不是因为生活所迫,谁愿把自己搞得满身才华
  15. 分析网站如何检测已经登录的QQ帐号
  16. PLSQL13,登录进去的时候有个弹窗,选择后同时勾选了dont show this message again,下次不再显示了,但是又想让他继续提示怎么办?
  17. 智能可以把碎片的事实价值弥聚化
  18. bootstrap读书笔记
  19. 阅读笔记《Changer: Feature Interaction is What You Need for Change Detection》
  20. 2022年证券从业资格证券市场基本法律法规考试多选题专练及答案

热门文章

  1. python模板怎么写,Python模板
  2. matlab求临界稳定时的k,MATLAB自动控制原理仿真
  3. 询问区间内最大值-最小值
  4. Unity3D基础2:新建模型
  5. 2018年全国多校算法寒假训练营练习比赛(第一场)D. N阶汉诺塔变形(找规律)
  6. 最小树形图(bzoj 4349: 最小树形图 2260: 商店购物)
  7. 使用色彩追踪和形态学运算得到图像中感兴趣区域
  8. matlab2c使用c++实现matlab函数系列教程-exp函数
  9. jQuery Mobile中面板panel的data-*选项
  10. 基于Android的人事管理系统开发与设计源码(二)