【课程作业】浮点运算分析及精度改进
Abstract
- 是什么
弊端- 为什么
- 怎么做
小数转换为分数
使用数组
C 函数库的设置
数学库- 实验
Python 分数运算
使用数组
C 函数库的设置
数学库- 总结
references
https://baike.baidu.com/item/%E6%B5%AE%E7%82%B9%E8%BF%90%E7%AE%97%E5%99%A8
https://cn.bing.com/search?q=python+%E5%88%86%E6%95%B0%E8%BF%90%E7%AE%97&qs=n&form=QBRE&sp=-1&pq=python+%E5%88%86%E6%95%B0&sc=0-9&sk=&cvid=BDBA7952446B4CE98E970FBD1B1C570B
https://www.jianshu.com/p/6073b6ecc1e5
https://blog.csdn.net/weixin_42124234/article/details/102725470
https://www.cnblogs.com/Vincent-Bryan/p/6438194.html
https://zhuanlan.zhihu.com/p/57010602
http://c.biancheng.net/view/314.html
文章目录
- C Primer Plus
- IEC 浮点标准
- fenv.h 头文件
- STDC FP_CONTRACT 编译指示
- 数学库为了浮点数运算也是操碎了心
- 计算机系统结构
- 浮点数表数范围
- 浮点数表数精度
- 《快速单精度浮点运算器的设计与实现》
- 《基于 FPGA 浮点运算器的研究》
- 1. 引言
- 2. 浮点表示
- 3. 规格化浮点数基本运算以及硬件电路的研究
- 《基于 RISC-V 浮点指令集 FPU 的研究与设计》
- 《基于多部分浮点数表示格式的高精度算法研究》
- 浮点数发展历史
- 浮点数的定义
- ==浮点数存在的问题==
- 《基于FPGA的单双精度浮点运算器研究与实现》
- 1.2 国内外浮点运算器研究现状
- 2.1 浮点数格式解析
- 第三章 浮点运算器算法研究
- 3.1 浮点加减法
- 3.2 浮点数乘法
- 3.3 浮点数除法
C Primer Plus
float、double、long double
- float 是系统中的基本浮点类型。它至少可以精确表示 6 位有效数字,通常 32 位。
- double 可能表示更大的浮点数。它可能表示比 float 更多的有效数字和更大的指数。它至少能精确表示 10 位有效数字,通常 64 位。
- long double 可能表示更大的浮点数。它能表示比 double 更多的有效数字和更大的指数。
浮点型常量
3.14159
.2
4e16
.8e-5
100.
默认情况下,编译器假定浮点型常量是 double 类型的精度。假设 some 是 float
类型的变量,some = 4.0 * 2.0;
通常,4.0 和 2.0 会被储存为 64 位的 double 类型,使用双精度进行乘法运算,然后将乘积截断成 float 类型的宽度。这样做会提高计算精度,但是会减慢程序的运行速度。
在浮点数后面加上 f 或 F 后缀可覆盖默认设置,编译器会将浮点型常量看作 float 类型,使用 l 或 L 后缀使得数字成为 long double 类型。
打印浮点值
jiaming@jiaming-System-Product-Name:/tmp$ ./float.o
32000.000000 can be weitten 3.200000e+04
And it's 0x1.f4p+14 in hexadecimal, powers of 2 notation
2140000000.000000 can be written 2.140000e+09
0.000053 can be written 5.320000e-05
jiaming@jiaming-System-Product-Name:/tmp$ cat float.c
/*************************************************************************> File Name: float.c> Author: jiaming> Mail: jmzhang2020@lzu.edu.com > Created Time: 2020年12月27日 星期日 16时33分11秒************************************************************************/# include<stdio.h>
int main()
{float aboat = 32000.0;double abet = 2.14e9;long double dip = 5.32e-5;printf("%f can be weitten %e\n", aboat, aboat);// c99printf("And it's %a in hexadecimal, powers of 2 notation\n", aboat);printf("%f can be written %e\n", abet, abet);printf("%Lf can be written %Le\n", dip, dip);return 0;}
浮点值的上溢和下溢
jiaming@jiaming-System-Product-Name:/tmp$ ./tmp.o
inf
jiaming@jiaming-System-Product-Name:/tmp$ cat tmp.c
/*************************************************************************> File Name: tmp.c> Author: jiaming> Mail: jmzhang2020@lzu.edu.com > Created Time: 2020年12月27日 星期日 16时59分35秒************************************************************************/# include<stdio.h>
int main()
{float toobig = 9.9E99;printf("%f\n", toobig);return 0;
}
浮点数舍入错误
jiaming@jiaming-System-Product-Name:/tmp$ ./tmp.o
4008175468544.000000
jiaming@jiaming-System-Product-Name:/tmp$ cat tmp.c
/*************************************************************************> File Name: tmp.c> Author: jiaming> Mail: jmzhang2020@lzu.edu.com > Created Time: 2020年12月27日 星期日 16时59分35秒************************************************************************/# include<stdio.h>
int main()
{float a, b;b = 2.0e20 + 1.0;a = b - 2.0e20;printf("%f\n", a);return 0;
}
原因是:计算机缺少足够的小数位来完成正确的计算。2.0e20
是 2 后面有 20 个 0。如果把该数加 1,那么发生变化的是第 21 位。要正确运算,程序至少要存储 21 位数字,而 float 类型的数字通常只能储存按指数比例缩小或放大的 6 或 7 位有效数字。在这种情况下,计算结果一定是错误的。另一方面,如果把 2.0e20
改成 2.0e4
,计算结果就没问题。因为 2.0e4
加 1 只需改变第 5 位上的数字,float 类型的精度足够进行这样的运算。
IEC 浮点标准
浮点模型
国际电工技术委员会(IEC)发布了一套浮点计算的标准(IEC 60559)。
C99 新增的大部分浮点工具(如,fenv.h 头文件和一些新的数学函数)都是基于此,另外,float.h 头文件定义了一些 IEC 浮点模型相关的宏。
x = s b e ∑ k = 1 p f k b − k x= sb^e\sum_{k=1}^{p} f^{b^{-k}}_{k} x=sbek=1∑pfkb−k
s s s 代表符号(±1)
b b b 代表基数。最常见的值是 2,因为浮点处理器通常使用二进制数字。
e e e 代表整数指数,限制最小值和最大值。这些值依赖于留出储存指数的位数。
f k f_k fk 代表基数为 b b b 时可能的数字。例如,基数为 2 时,可能的数字是 0 和 1;在十六进制中,可能的数字是 0~F。
p p p 代表精度,基数为 b b b 时,表示有效数的位数。其值受限于预留储存有效数字的位数。
举例:
24.51=(±1)10^3(2/10+4/100+5/1000+1/10000+0/100000)
假设符号为正,基数 b 为 2,p 是 7(用 7 位二进制数表示),指数是 5,带储存的有效数是 1011001。
24.25=(±1)2^5(1/2+0/4+1/8+1/16+0/32+0/64+1/128)
正常值和低于正常的值
举例:
十进制 b=10;浮点值的精度 p=5;
指数 = 3,有效数 .31841(.31841E3)
指数 = 4,有效数 .03184(.03184E4)
指数 = 5,有效数 .00318(.00318E5)
第 1 种精度最高,因为在有效数中使用了所有的 5 位可用位。规范化浮点非零值是第 1 位有效位为非零的值,这也是通常储存浮点数的方式。
假设,最小指数(FLT_MIN_EXP)为 -10,那么最小的规范值是:
指数 = -10,有效数 = .10000(.10000E-10)
通常,乘以或除以 10 意味着指数增大或减小,但是在这种情况下,如果除以 10,却无法再减小指数。但是,可以改变有效数获得这种表示:
指数 = -10,有效数 = .01000(.01000E-10)
这个数被称为低于正常的,因为该数并未使用有效数的全部精度,损失了一位的信息。
对于这个假设,0.1000E-10 是最小的非零正常值(FLT_MIN),最小的非零低于正常值是 0.00001E-10(FLT_TRUE_MIN)。
float.h
中的宏 FLT_HAS_SUBNURM、DBL_HAS_SUBNORM、LDBL_HAS_SUBNORM 表征实现如何处理低于正常的值。下面是这些宏可能会用到的值及其含义:
- -1:不确定
- 0:不存在(可能会用 0 替换低于正常的值)
- 1:存在
math.h
库提供一些方法,包括 fpclassify()
和 isnormal()
宏,可以识别程序何时生成低于正常的值,这样会损失一些精度。
求值方案
float.h
中的宏 FLT_EVAL_METHOD 确定了实现采用何种浮点表达式的求值方案:
- -1:不确定
- 0:对在所有浮点类型范围和精度内的操作、常量求值
- 1:对在 double 类型的精度内和 float、double 类型的范围内的操作、常量求值,对 long double 范围内的 long double 类型的操作、常量求值
- 2:对所有浮点类型范围内和 long double 类型精度内的操作和常量求值
舍入
float.h
中的宏 FLT_ROUNDS 确定了系统如何处理舍入,其指定值所对应的舍入方案如下:
- -1:不确定
- 0:趋零截断
- 1:舍入到最接近的值
- 2:趋向正无穷
- 3:趋向负无穷
系统可以定义其他值,对应其他舍入方案,一些系统提供控制舍入的方案,在这种情况下,fenv.h
中的 festround() 函数提供编程控制。
在十进制下,8/10 或 4/5 都可以精确表示 0.8。但是大部分计算机系统都以二进制储存结果,在二进制下,4/5 表示为一个无线循环小数:
0.1100110011001100…
因此,在把 0.8 储存在 x 中时,将其舍入为一个近似值,其具体值取决于使用的舍入方案。
有些实现可能不满足 IEC 60559 的要求,例如,底层硬件可能无法满足要求,因此,C99 定义了两个可用作预处理器指令的宏,检查实现是否符合规范。
fenv.h 头文件
提供一些与浮点环境交互的方法。允许用户设置浮点控制模式值(该值管理如何执行浮点运算)并确定浮点状态标准(或异常)的值(报告运算效果的信息),例如,控制模式设置可指定舍入的方案:如果运算出现浮点溢出则设置一个状态标志,设置状态标志的操作叫做抛出异常。
#pragma STDC FENV_ACCESS ON // 开启支持
#pragma STDC FENV_ACCESS OFF // 关闭支持
#pragma STDC FENV_ACCESS DEFAULT // 默认设置
STDC FP_CONTRACT 编译指示
FPU 可以把多个运算符的浮点表达式合并成一个运算,但是你可以将它们独立开来计算。
#pragma STDC FP_CONTRACT OFF
val = X * Y - Z;
#pragma STDC FP_CONTRACT ON
数学库为了浮点数运算也是操碎了心
举例来看,
C90 数学库:
double sin(double);
double sqrt(double);
C99 和 C11 库为所有这些函数都提供了 float 类型和 long double 类型的函数:
float sinf(float);
long double sinl(long double);
loglp(x) 表示的值与 log(1+x) 相同,但是 loglp(x) 使用了不同的算法,对于较小的 x 值而言计算更精确。因此,可以使用 log() 函数作普通运算,但是对于精度要求较高且 x 值较小时,用 loglp() 函数更好。
计算机系统结构
实数与浮点数比较
表示范围 | 表示精度 | 唯一性 | |
---|---|---|---|
实数 | 无限 | 连续 | 不冗余 |
浮点数 | 有限 | 不连续 | 冗余 |
浮点数表数范围
N = m × r m e , e = r e g N=m\times r_m^e,e=r_e^g N=m×rme,e=reg
一种浮点数据表示方式需要有 6 个参数来定义。
两个数值:
m:尾数的值,还包括尾数采用的码制(原码或补码)和数制(小数或整数);
e:阶码的值,一般采用移码(又称偏码、增码、余码等)或补码,整数;
两个基:
r m r_m rm:尾数的基,通常有二进制,四进制、八进制、十六进制和十进制等;
r e r_e re:阶码的基,在目前见到的所有浮点数据表示方式中, r e r_e re均为 2。
两个字长:
p:尾数长度,这里的 p 不是指尾数的二进制位数,当 r m = 16 r_m=16 rm=16 时,每 4 个二进制位表示一位尾数;
q:阶码长度,由于阶码的基通常为 2,因此,在一般情况下,q 就是阶码部分的二进制位数。
在计算机中,数据总是要用存储部件来存放的,而计算机的存储部件的字长都是有限的,因此,任何一种浮点数表示方式所能表示的浮点数的个数和范围都是有限的。
在尾数采用原码、纯小数,阶码采用移码、整数的浮点数表示方式中,规格化浮点数 N 的表数范围是:
r m − 1 ⋅ r m − r e q ≤ ∣ N ∣ ≤ ( 1 − r m − p ) ⋅ r m r e q − 1 r_m^{-1} \cdot r_m^{-r_e^q} \leq |N| \leq (1-r_m^{-p}) \cdot r_m^{r_e^q-1} rm−1⋅rm−req≤∣N∣≤(1−rm−p)⋅rmreq−1
尾数用原码、纯小数时规格化浮点数的表数范围
表数范围 | 规格化尾数 | 阶码 | 规格化浮点数 |
---|---|---|---|
最大正数 N m a x N_{max} Nmax | 1 − r m − p 1-r_m^{-p} 1−rm−p | r e q − 1 r_e^q-1 req−1 | ( 1 − r m − p ) ⋅ r m r e q − 1 (1-r_m^{-p}) \cdot r_m^{r_e^q-1} (1−rm−p)⋅rmreq−1 |
最小正数 N m i n N_{min} Nmin | r m − 1 r_m^{-1} rm−1 | − - − | r m − 1 ⋅ r m − r e q r_m^{-1} \cdot r_m^{-r_e^q} rm−1⋅rm−req |
最大负数 − N m a x -N_{max} −Nmax | − r m − 1 -r_m^{-1} −rm−1 | − - − | − r m − 1 ⋅ r m − r e q -r_m^{-1} \cdot r_m^{-r_e^q} −rm−1⋅rm−req |
最小负数 − N m i n -N_{min} −Nmin | − ( 1 − r m − p ) -(1-r_m^{-p}) −(1−rm−p) | − r e q -r_e^q −req | − ( 1 − r m − p ) ⋅ r m r e q − 1 -(1-r_m^{-p}) \cdot r_m^{r_e^q-1} −(1−rm−p)⋅rmreq−1 |
当尾数用补码表示时,正数区间的表数范围与尾数采用原码时完全相同,而负数区间的表数范围为:
− r m r e q − 1 ≤ ∣ N ∣ ≤ − ( r m − 1 + r m − p ) ⋅ r m − r e q -r_m^{r_e^q-1} \leq |N| \leq -(r_m^{-1}+r_m^{-p}) \cdot r_m^{-r_e^q} −rmreq−1≤∣N∣≤−(rm−1+rm−p)⋅rm−req
尾数用补码、纯小数时规格化浮点数的表数范围
表数范围 | 规格化尾数 | 阶码 | 规格化浮点数 |
---|---|---|---|
最大正数 N m a x N_{max} Nmax | 1 − r m − p 1-r_m^{-p} 1−rm−p | r e q − 1 r_e^q-1 req−1 | ( 1 − r m − p ) ⋅ r m r e q − 1 (1-r_m^{-p}) \cdot r_m^{r_e^q-1} (1−rm−p)⋅rmreq−1 |
最小正数 N m i n N_{min} Nmin | r m − 1 r_m^{-1} rm−1 | − - − | r m − 1 ⋅ r m − r e q r_m^{-1} \cdot r_m^{-r_e^q} rm−1⋅rm−req |
最大负数 − N m a x -N_{max} −Nmax | − ( r m − 1 + r m − p ) -(r_m^{-1}+r_m^{-p}) −(rm−1+rm−p) | − - − | − ( r m − 1 + r m − p ) ⋅ r m − r e q -(r_m^{-1}+r_m^{-p}) \cdot r_m^{-r_e^q} −(rm−1+rm−p)⋅rm−req |
最小负数 − N m i n -N_{min} −Nmin | − 1 -1 −1 | − r e q -r_e^q −req | − r m r e q − 1 -r_m^{r_e^q-1} −rmreq−1 |
浮点数表数精度
表数精度也称为表数误差,浮点数存在表数精度的根本原因是由于浮点数的不连续性造成的,因为任何一种浮点数表示方式的字长总是有限的。如果字长为 32 位,则这种浮点数表示方式所能表示的浮点数的个数最多是 2 32 2^{32} 232 个,而数学中的实数是连续的,它有无穷多个,因此,一种浮点数表示方式能表示的浮点数的个数只是实数中很少的一部分,即它的一个子集,我们称之为这种浮点数表示方式的浮点数集。
浮点数集 F 的表数误差可以这样定义,令 N 是浮点数集 F 内的任一给定实数,而 M 是 F 中最接近 N,且被用来代替 N 的浮点数,则绝对表数误差: δ = ∣ M − N ∣ \delta=|M-N| δ=∣M−N∣,相对表数误差 δ = ∣ M − N N ∣ \delta=|\frac{M-N}{N}| δ=∣NM−N∣。
由于在同一种浮点数表示方式中,规格化浮点数的尾数有效位长度是确定的,因此,规格化浮点数的相对表数误差是确定的,又由于规格化浮点数在数轴上的分布是不均匀的,因此它的绝对表数误差是不确定的。这一点与定点数表示方式正好相反,定点数表示方式的绝对误差是确定的,而其相对误差是不确定的。
浮点数表数误差产生的直接原因有两个,一个是两个浮点数a和b都在某种浮点数表示方式的浮点集内,而a和b的运算结果却可能不在这个浮点集内,因此必须用这个浮点集内与它最接近的某个浮点数来表示,从而也就造成了表数误差。另一个是将数据从十进制转化为二进制、四进制、八进制或十六进制时可能产生误差。
第一种原因:
举例,q=1,p=2,rm=2,re=2
一种浮点数表示方式能表示的全部浮点数
1(1.1) | 0(1.0) | -1(0.1) | -2(0.0) | |
---|---|---|---|---|
0.75(0.11) | 3/2 | 3/4 | 3/8 | 3/16 |
0.5(0.10) | 1 | 1/2 | 1/4 | 1/8 |
-0.5(1.10) | -1 | -1/2 | -1/4 | -1/8 |
-0.75(1.11) | -3/2 | -3/4 | -3/8 | -3/16 |
若有两个浮点数:a1=1/2,b1=3/4 都在所定义的浮点集内,而它们相加的结果:a1+b1=5/4,则不在这个浮点数集内,为此必须用该浮点数集内最靠近 5/4 的浮点数 1 或 3/2 来代替
从而产生绝对表数误差:
δ = ∣ 5 / 4 − 3 / 2 ∣ = 1 / 4 \delta=|5/4-3/2|=1/4 δ=∣5/4−3/2∣=1/4 或 δ = ∣ 5 / 4 − 1 ∣ = 1 / 4 \delta=|5/4-1|=1/4 δ=∣5/4−1∣=1/4
相对表数误差为:
δ = ∣ 5 / 4 − 3 / 2 5 / 4 ∣ = 1 / 5 \delta=|\frac{5/4-3/2}{5/4}|=1/5 δ=∣5/45/4−3/2∣=1/5或 δ = ∣ 5 / 4 − 1 5 / 4 ∣ = 1 / 5 \delta=|\frac{5/4-1}{5/4}|=1/5 δ=∣5/45/4−1∣=1/5
另一种原因:原始数据从外部进入计算机的过程中,通常要讲数据从十进制转化为二进制、四进制、八进制或十六进制等。因为物理数据存储单元的长度总是有限的,从而可能产生表数误差。
将十进制数字0.1输入二进制的计算机中,出现循环小数,即:
0.1(10)
=0.000110011001100···(2)
=0.0121212···(4)
=0.06146314···(8)
=0.1999···(16)
用有限长度的尾数是不能精确表示这个数的,于是就产生了一个如何处理不能表示的尾数低位部分的问题,通常要进行舍入处理。舍入的方法有很多种,各种不同的舍入方法产生的表数误差也不相同。为了能够在有限的尾数字长内获得尽量高的表数精度,舍入必须在规格化之后进行。
0.1(10)
=0.110011001100···(2)x2-3
=0.121212···(4)x4-1
=0.6146314···(8)x8-1
=0.1999···(16)x160
十进制 0.1 的多种浮点数表示方式:
尾数的基值 | 阶符 | 阶码 | 尾符 | 尾数 |
---|---|---|---|---|
rm=2 | 0 | 101 | 0 | 1100110011001100 |
rm=4 | 0 | 111 | 0 | 0110011001100110 |
rm=8 | 0 | 111 | 0 | 1100110011001100 |
rm=16 | 1 | 000 | 0 | 0001100110011001 |
对于不同的尾数基值rm,舍入时要处理的尾数低位部分也是不一样的,舍入后的最终结果不会相同。在一般情况下,随着尾数基值rm的增大,规格化后的二进制尾数中的前置"0"的个数也就越多。只有在尾数基值rm=2时,才能保证在规格化后的尾数中不出现前置"0",从而获得最高的表数精度。
规格和浮点数的表数精度主要与尾数基值rm和尾数长度 p 有关,在一般情况下,认为规格化尾数最后一位的精确度是一半,这样,规格化浮点数的表数精度可以表示如下:
δ ( r m , p ) = 1 2 r m − ( p − 1 ) \delta(r_m,p)=\frac{1}{2}r_m^{-(p-1)} δ(rm,p)=21rm−(p−1)
当 rm>2时,
δ ( r m ) = 2 ⌈ log 2 r m ⌉ ⋅ 2 − p 2 \delta(r_m)=2^{\lceil \log_2{r_m} \rceil}\cdot2^{-p^2} δ(rm)=2⌈log2rm⌉⋅2−p2
结论:当浮点数的尾数长度(指二进制位数)相同时,尾数基值rm,取 2 具有最高的表数精度。当尾数基值 rm>2时,浮点数的表数精度与 rm=2相比将损失 2 ⌈ log 2 r m ⌉ − 1 2^{\lceil \log_2{r_m} \rceil-1} 2⌈log2rm⌉−1 倍,相当于尾数减少了 ⌈ log 2 r m ⌉ − 1 \lceil \log_2{r_m} \rceil-1 ⌈log2rm⌉−1个二进制位。
《快速单精度浮点运算器的设计与实现》
田红丽,闫会强,赵红东.快速单精度浮点运算器的设计与实现[J].河北工业大学学报,2011,40(03):74-78.
运算器是 CPU 的重要组成部分,作为典型的 PC 机一般都至少具有一个定点运算器,在 586 之前的机型中,由于当时硬件条件和工艺的限制,浮点运算器一般以协处理器的形式出现,90 年代以后,随着硬件工艺的发展,浮点运算器 FPU 已可以集成到 CPU 内部,其中 FPGA(现场可编程门阵列)技术使其成为现实。
在计算机系统的发展过程中,对实数目前使用最广泛的是浮点数表示法。而浮点数在运算时,有两种形式:非规格化和规格化浮点运算。规格化浮点运算要求:运算前、运算后都是规格化的数,这种运算在计算机中尾数能获得最大的有效数字,所以计算机中一般选用规格化浮点运算。
该论文设计了一个快速单精度浮点数运算器:
- 单精度浮点数规格化和数据类型的判别模块:根据输入数据的形式,对尾数进行规格化判定。
- 单精度浮点加减运算预处理模块:当两个规格化单精度浮点数进行加法或减法运算时,首先要对阶码和符号进行处理。阶码分,要进行对齐操作,即小阶向大阶看齐。而运算结果的符号与最大浮点数的符号一致。
- 并行单精度浮点加减运算模块:不论做加或减运算,要全部采用补码加运算来完成.当两数相加时,直接用两数的补码进行加运算。当两数相减时,被减数直接取补码,减数先取反,再求补码,然后对两数再进行加运算。加法器采用快速的并行加运算实现。
- 单精度浮点乘或除运算预处理模块:两个浮点数进行乘或除运算时,运算结果的符号等于参与运算的两数符号的异或运算。运算结果的阶码值为:乘运算 E=E 1 +E 2 -7FH;除运算 E=E 1 -E 2 +7FH。(E结果的阶码,E1是被乘数或被除数的阶码,E 2 是乘数或除数的阶码)。
- 并行单精度浮点乘法运算模块:对于该乘法器采用了不带符号的 24*24 并行阵列乘法器来实现,这种设计方法将大大缩短乘法运算所需的时间。
- 并行单精度浮点除法运算模块:先判 0,若除数为 0,那么发出错误信息;否则,让被除数和除数直接进入并行除法器(不恢复余数阵列除法器)中进行运算。
- 运算结果处理模块:对运算的结果进行舍入、规格化、判别数据类型等操作。
《基于 FPGA 浮点运算器的研究》
戴丹丹. 基于FPGA浮点运算器的研究[D].内蒙古大学,2012.
1. 引言
FPGA(现场可编程门阵列)
是由可编程互连连接的可配置逻辑块矩阵和 IOB 构成的可编程半导体组成。利用硬件描述语言描述数字系统的功能,经过一系列转换程序、自动布局布线、模拟仿真等过程;最后生成配置 FPGA 器件的数据文件并下载到 FPGA 中。这样就实现了满足用户要求的专用集成电路,真正达到了用户自行设计、自行研制和自行生产集成电路的目的。
2. 浮点表示
根据小数点的位置是否固定,分为定点表示和浮点表示。
浮点数的表示范围主要由阶码的位数来决定,有效数字的精度主要由尾数的位数来决定。
规格化浮点数
3. 规格化浮点数基本运算以及硬件电路的研究
浮点加减运算
浮点运算的一般运算规则:
Z=X+Y=-0.5+3.375=2.875,说明 IEEE754 浮点加法运算过程。
X=-0.5,1.0x2-1,s=1,e=-1+127=126,f=0。用此方法求出 Y。
Y=3.375, 1.1011x21,s=0,e=1,f=1011。
X: 1 01111110 00000000000000000000000
Y: 0 10000000 10110000000000000000000
因为 X 和 Y 的阶码不同,尾数不能直接相减,要把 X 的尾数右移 2 位,这样 X 和 Y 就有了相同的阶码。
0 10000000 01110000000000000000000(2.875)
一般的规格化浮点数的加减运算步骤都要经过对阶、尾数加减、尾数规格化、舍入、判断溢出几个步骤。
- 对阶
2. 尾数加减
3. 尾数规格化
4. 舍入、判断溢出
浮点乘法运算
浮点除法运算
《基于 RISC-V 浮点指令集 FPU 的研究与设计》
[1]潘树朋,刘有耀,焦继业,李昭.基于RISC-V浮点指令集FPU的研究与设计[J/OL].计算机工程与应用:1-10[2021-01-02].http://kns.cnki.net/kcms/detail/11.2127.TP.20201112.1858.002.html.
浮点处理器作为一种加速器,与整数流水线并行工作,并从主处理器分担大型计算、高延迟浮点指令。如果这些指令是由主处理器执行,由于浮点除法、平方根和乘累加等运算需要大量的计算和较长的等待时间,会降低主处理器的速度,运算精度也会有所损失,因此浮点处理器有助于加速整个芯片。
许多嵌入式处理器,尤其是一些传统的设计,不支持浮点运算。许多浮点处理器的功能可以通过软件库来仿真,虽然节省了浮点处理器的附加硬件成本,但是速度明显较慢,不足以满足嵌入式处理器的实时性要求。为了提高系统的性能,需要对浮点处理器进行硬件实现。
《基于多部分浮点数表示格式的高精度算法研究》
[1]杜配冰. 基于多部分浮点数表示格式的高精度算法研究[D].国防科技大学,2017.
浮点数发展历史
浮点数的定义
浮点数存在的问题
《基于FPGA的单双精度浮点运算器研究与实现》
[1]王景悟. 基于FPGA的单双精度浮点运算器研究与实现[D].西安石油大学,2017.
1.2 国内外浮点运算器研究现状
在 CPU 结构设计的初期,浮点运算单元并没有集成在 CPU 的内部,它是一个独立的芯片被称作浮点协处理器,其作用是辅助 CPU 一起处理数据。从 Intel 的 80486DX CPU 开始,FPU 才被集成到了 CPU 内部。
2.1 浮点数格式解析
第三章 浮点运算器算法研究
3.1 浮点加减法
3.2 浮点数乘法
3.3 浮点数除法
【课程作业】浮点运算分析及精度改进相关推荐
- 【Python】大数据挖掘课程作业3——使用朴素贝叶斯分类对B站评论进行分析
[Python]大数据挖掘课程作业3--使用朴素贝叶斯分类对B站评论进行分析 参考资料:<Python数据科学手册> 数据来源:B站观察者网.观视频工作室.央视新闻.小央视频.环球网.环球 ...
- gis可达性分析步骤_消息速递 | 学院2017级城市管理本科班GIS课程作业成果汇报顺利进行...
2020年1月3日下午,学院2017级城市管理本科班"地理信息系统"课程作业成果汇报展示在公共政策实验室顺利举行.公共管理学院城市规划与管理系叶裕民教授.于洋副教授前往现场并对各组 ...
- 传感器课程作业创新项目申报书--高分辨率3D激光雷达
传感器课程作业 创新项目申报书 一.项目简介(研究背景,意义以及研究内容) 1.项目背景 化石能源的日渐枯竭以及气候环境的恶化使得绿色节能可持续发展理念普世流行,其中交通减排是节能减排的主要途径,双碳 ...
- 《坐热板凳》第五次作业:团队项目需求改进与系统设计
实验九 团队作业5-团队项目需求改进与系统设计. 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www. ...
- 1. 吴恩达机器学习课程-作业1-线性回归
fork了别人的项目,自己重新填写,我的代码如下 https://gitee.com/fakerlove/machine-learning/tree/master/code 代码原链接 文章目录 1. ...
- 研究生语音识别课程作业记录(二) 非特定人孤立词识别
研究生语音识别课程作业记录(二) 非特定人孤立词识别 前言 一. 任务要求 二. 识别方法 三. 语音数据库 四. 特征参数提取 五. 识别过程及分析 六. 小结 前言 研究生期间的语音识别课程作业记 ...
- 研究生语音识别课程作业记录(一) 非特定人孤立词识别
研究生语音识别课程作业记录(一) 非特定人孤立词识别 前言 一. 任务要求 二. 识别方法 三. 语音数据库 四. 特征参数提取 五. 识别过程及分析 六. 小结 前言 研究生期间的语音识别课程作业记 ...
- 《你说对就队》第六次作业:团队项目系统设计改进与详细设计
<你说对就队>第六次作业:团队项目系统设计改进与详细设计 内容 项目 这个作业属于哪个课程 [教师主页] 这个作业的要求在哪里 [作业要求] 团队名称 <你说对就队> 作业学习 ...
- 机器学习与数据挖掘 课程作业 基于数据驱动的空调结霜程度检测方法研究
机器学习与数据挖掘 课程作业 基于数据驱动的空调结霜程度检测方法研究 摘要: 在我国的夏热冬冷地区,由于没有集中供暖,在冬季使用空调制热进行供暖是一种很常见的方式,但该地区冬季空气相对湿度较高并且环境 ...
最新文章
- 为了边缘计算,亚马逊、谷歌、微软已正面交锋!
- div+css内容需注意
- centos查看系统/硬件信息及运维常用命令
- 阿里巴巴计算机视觉领域最强阵容集结完毕团体参加CVPR会议
- C# 使用 DirectoryInfo 递归指定目录中的所有目录及文件
- PL/SQL-FOR UPDATE 与 FOR UPDATE OF的区别
- Abseil之Return Policy
- maven编译,控制台中文乱码解决方案
- eclipse启动进入工作空间出现cound not restore workbench layout
- matlab latex 表格,latex表格绘制及对齐
- 即时通讯系统集成开发
- 德州大学达拉斯分校计算机科学,德克萨斯大学达拉斯分校排名
- 网络安全与计算机信息管理论文,计算机信息管理技术在网络安全的应用论文
- 使用STAF进行自动化安装测试
- 懒惰的人生,注定一事无成
- 最新网站证书提示风险的原因和几个解决方法
- Linux apache服务器(上)
- labview事件结构的使用
- Codeforces 1280C: Jeremy Bearimy
- mysql身份证号用什么存储_mysql 字段存储类型