第7章DSP定点数和浮点数(重要)

合集下载

精品课件-数字信号处理(第三版) 刘顺兰-第7章

精品课件-数字信号处理(第三版) 刘顺兰-第7章

第7章数字信号处理中的有限字长效应
7.1.2 定点制误差分析 1. 数的定点表示 定点制下,一旦确定了小数点在整个数码中的位置,在整个
运算过程中即保持不变。因此,根据系统设计要求、 数值范围来 确定小数点处于什么位置很重要,这就是数的定标。 数的定标有Q表示法和S表示法两种。Q表示法形如Qn,字母Q后的 数值n表示包含n位小数。如Q0表示小数点在第0位的后面,数为整 数;Q15 表示小数点在第15位的后面,0~14位都是小数位。S表 示法则形如Sm.n,m表示整数位,n表示小数位。以16位DSP为例, 通过设定小数点在16位数中的不同位置,可以表示不同大小和不 同精度的小数。表7.1列出了一个16位数的16种Q表示、 S表示及 它们所能表示的十进制数值范围。
小的正数: (01.000..0)2×2-127=1×2-127≈5.9×10-39
(4) 当S=1,E=-127,F的23位均为1时,表示的浮点数为绝 对值最小的负数:
(10.111..1)2×2-127=(-1-2-23)×2-127≈-5.9×10-39 双精度浮点数占用8个字节(64位)存储空间,包括1位符号位、 11位阶码、 52位尾数,数值范围为1.7E-308~1.7E+308。
第7章数字信号处理中的有限字长效应
乘除运算时,假设进行运算的两个数分别为x和y,它们的Q 值分别为Qx和Qy,则两者进行乘法运算的结果为xy,Q值为Qx+Qy, 除法运算的结果为x/y,Q值为Qx-Qy。
在程序或硬件实现中,上述定标值的调整可以直接通过寄存 器的左移或右移完成。若b>0,实现x×2b需将存储x的寄存器左 移b位;若b<0,实现x×2b则需将存储x的寄存器右移|b|位即可。
称为小数点位置。

关于dsp中程序定点数和浮点数转换问题(Q15格式)

关于dsp中程序定点数和浮点数转换问题(Q15格式)

关于dsp中程序定点数和浮点数转换问题(Q15格式)看ti的逆变器程序,看到采集后的ADBUF数据全部都是《5,这就搞不明白了,为什么要左移5呀?然后看到上面说是兼容Q15,在QQ群里也问了高手,说是用于DSP小数运算,于是在网上找了下Q15的定义,下面把Q15整理下。

许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。

可以利用Q格式进行浮点数据到定点的转化,节约CPU时间。

实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。

所以要选择一个适当的定标格式才能更好的处理运算。

Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的一位用作符合位。

假设小数点在n位的左边(从右向左数),从而确定小数的精度例如Q15表示小数部分有15位,一个short型数据,占2个字节,最高位是符号位,后面15位是小数位,就假设小数点在第15位左边,表示的范围是:-1<X<0.9999695 。

浮点数据转化为Q15,将数据乘以2^15;Q15数据转化为浮点数据,将数据除以2^15。

例如:假设数据存储空间为2个字节,0.333×2^15=10911=0x2A9F,0.333的所有运算就可以用0x2A9F 表示,同理10911×2^(-15)=0.332977294921875,可以看出浮点数据通过Q格式转化后是有误差的。

例:两个小数相乘,0.333*0.414=0.1378620.333*2^15=10911=0x2A9F,0.414*2^15=13565=0x34FDshort a = 0x2A9F;short b = 0x34FD;short c = a * b >> 15; //两个Q15格式的数据相乘后为Q30格式数据,因此为了得到Q15的数据结果需要右移15位这样c的结果是0x11A4=0001000110100100,这个数据同样是Q15格式的,它的小数点假设在第15位左边,即为0.001000110100100=0.1378173828125...和实际结果0.137862差距不大。

DSP芯片的定点运算

DSP芯片的定点运算
x float xq 2Q
浮点数 x=0.5,定标 Q=15, 则定点数=0.5*32768=16384
SuQian College
Q表示、S表示及数值范围
QHale Waihona Puke 示 Q15 Q14. . . . . .
Q1 Q0
S表示 S0.15 S1.14
. . . . . .
S14.1 S15.0
十进制数表示范围 -1≤X≤0.9999695 -2≤X≤1.9999390
. . . . . .
-16384≤X≤16383.5 -32768≤X≤32767
1 定点的基本概念
SuQian College
1、数的定标
在定点DSP芯片中,采用定点数进行数值运算, 其操作数一般采用整型数来表示
DSP芯片的数以2的补码形式表示 数的定标:Q表示法和S表示法 对定点数而言,数值范围与精度是一对矛盾, 一个变量要想能够表示比较大的数值范围,必须 以牺牲精度为代价。
SuQian College
Q表示法16进制数2000H
Q0表示为8192
SuQian College
0010000000000000

号 位 Q15表示为0.25
小数点的位置
0010000000000000
小数点的位置
浮点数与定点数的转换关系
浮点数转换为定点数
xq int x 2Q
定点数转换为浮点数

Q格式_dsp定点和浮点数学运算规则

Q格式_dsp定点和浮点数学运算规则

Q格式有符号数的表示法,机器数(出现在电脑的二进位数值)有3个特点,无符号或符号转换成数值来表示,没有+10101这样的资料,而是以010101来表示,只表示单纯的整数或小数,小数点的位置预设在一定的位置而较少变动,它的长度受到电脑硬体的限制,而不能无限增长。

Q格式,就是将一个小数放大若干倍后,用整数来表示小数。

Q格式前提无符号数:当参与运算的数值没有负数且运算的结果也没有负数时,则所有字元都可以表示数值,这种没有符号的数,称为无符号数(如记忆体储存位址),有符号数:数值中有某位数值代表符号,通常最高位作为符号位,0代表正,1代表负。

真值:有符号数所代表的数值,例如:110所代表的值是-2 而非6,有符号数只要去除符号位就可以获得该数的大小,在运算时,它的符号位可参与运算。

但在加减运算时,必须将它分离出来,才能进行运算。

有时,还要确定哪个有符号数的真值比较大,才能确定结果的符号。

为了达到这些功能,电路的设计就相当复杂。

所以很多电脑系统不直接使用有符号数,而使用有符号数的1’s补数或2’s补数表示法作为编码系统正弦脉波宽度调变(SPWM)之控制方法经Q 格式乘法器转换成振幅与频率可变V/F 控制,当成其单相感应马达的输入信号,藉由控制责任周期的大小,以达到变电压相对改变频率的效果。

DSP1.实现数位系统的第一步在自然世界中,所有的物理量包括时间、电压、质量、位移等等,都是类比的、连续的。

可是在数位系统中,讯号是在不连续的时间点取样,物理量或讯号的大小也不再是连续,而是被量化(Quantized)。

在数位系统中,只能用有限字元长度的数字去表示数量的大小,而不能以无限精确的数值(实数)去表示。

为了实现数位系统;使用了定数数与浮点数的表示法。

a)定点数(Fixed Point Number):指一个数字的表示,其小数点是在固定的位置(位元)。

b)浮点数(Floating Point Number):使用假数以及指数两部分来表示数值。

DSP学习笔记(二)——DSP中浮点数与定点数格式与运算处理

DSP学习笔记(二)——DSP中浮点数与定点数格式与运算处理

DSP学习笔记(⼆)——DSP中浮点数与定点数格式与运算处理DSP学习笔记(⼆)——DSP中浮点数与定点数格式与处理1 DSP中的数据表述DSP中数据通常是有定点数与表⽰,其中可以对字长进⾏相关定义,可以选取字长为16位、24位、32位不同字长使⽤。

⽽格式与字长决定了数据的精度与动态范围,同时也⼀定程度上决定了DSP处理器的功耗、成本与编程难度。

定点数:⼩数点位置为确定的。

浮点数:⼩数点位置可以改变。

定点运算的硬件实现较为简单,功耗较⼩,主要注意的是数据的定标、溢出以及误差。

器减结构较为复杂,但是精度较⾼,⾼级语⾔容易⽀持。

2 定点数的格式与相关运算2.1 定点数格式定点数格式:Q n 格式,n为⼩数位数。

即Q15 ,⼩数点右边有15个⼩数位,如果我们定义了⼀个长度为32位的数字,那么⼩数位为15,1位符号位,16位为整数位。

整数⼩数点固定在最后,定点数⼩数位固定使⽤上⽂的Q n 格式表⽰,两者都使⽤⼆进制补码形式表⽰。

例: Q4格式:01010011b=1·22+1·20+1·2-3+1·2-4=83/24=5.1875对于负数(最⾼位MSB为1),要先把它转化为⽆符号⼆进制数,再进⾏计算,最后加上负号。

图2-1 ⼆进制Q格式表⽰定点数与浮点数转化时需要使⽤2n 的关系进⾏转化。

转化关系如下图:图2-2 定点数与浮点数转化关系浮点数转换为定点数时,由于⼩数点后的位数有限,会产⽣截断误差。

2.2 数值范围与精度Qn 格式,字长为N数值范围: -2N-12n~2N-1-12n精度:12n由于符号位占1位,所以数据位为N-1,n越⼤范围越⼩,但精度越⾼。

图2-3 数值范围与精度2.3 动态范围数据格式中最⼤值与最⼩值之⽐即为动态范围。

N位定点数动态范围:分贝表⽰:dsp⼤多采⽤16位定点数,动态范围为90.3db。

Dsp⼤多采⽤16为定点数,运算硬件实现较为简单,更⼤动态范围应⽤可以使⽤拓展字长⽅式。

定点 DSP 处理浮点数

定点 DSP 处理浮点数

定点DSP处理浮点数BG6RDFTMS320C5509A是16位定点数处理器,其累加器是32位/40位的。

在定点处理器中处理浮点数需要对定点数进行定标。

下面所说的定点数都是指有符号数。

通常采用的定标有Q15和Q31,分别表示小数点后有二进制15位和二进制16位。

因此16位Q15最大能表示的数是1 2 ,32位Q31最大能表示的数是1 2 。

定标不同的数可以直接相乘,例如Q13*Q15=Q28。

两个定标不同的数不能直接相加,比如Q13+Q15,通常要将Q15右移两位,转换为Q13后再相加,当然这样损失了两位的精度。

DSP进行的乘累加操作常常Q15的数,这样结果为Q30,存储在累加器中。

为了将累加器的结果转换为更为常用的Q31定标,55x系列DSP在状态寄存器ST1_55中设置了FRCT 控制位,FRCT=1时,乘积自动左移一位,这样乘积变成了Q31。

对于累加器中Q31定标的数,直接取累加器中高16位,就能获得结果的Q15定标数。

很多时候Q15不能解决问题,比如IIR滤波器num, den系数中通常有大于等于1的系数,超过了Q15的范围,只能用Q14,Q13等定标。

这时乘累加操作就需要进行修正了,比如IIR滤波器中系数用Qx定标,输入数据和输出数据用Qy定标,Q Q Q ,为获得Qy的输出数据必须将累加器中的乘积右移x位,另外在乘累加操作开始前必须将输入数据在累加器中左移y位,进行对齐后才能进行乘累加。

当然,这种修正都是在没有考虑FRCT 的情况下。

在C5500 DSPLIB中iircas51函数中,FRCT设置为1,输入输出数据采用Q15定标,如果系数也是Q15定标,则程序运行无误,如果系数采用Q14及以下定标则会产生严重的问题。

以下是其代码片段:MOV *AR0+ << #16, AC1 ; HI(AC1) = x(n)||RPTBLOCAL loop2‐1 ;inner loop: process a bi‐quadMPYM *AR1+, AC1, AC0 ; AC0 = b0*x(n)MACM *AR1+, *(AR3+T0), AC0 ; AC0 += b1*x(n‐1)MACM *AR1+, *AR3, AC0 ; AC0 += b2*x(n‐2)MOV HI(AC1), *AR3 ; x(n) replaces x(n‐2)||AADD T1, AR3 ; point to next x(n‐1)MASM *AR1+, *(AR4+T0), AC0 ; AC0 ‐= a0*y(n‐1)MASM *AR1+, *AR4, AC0 ; AC0 ‐= a1*y(n‐2)MOV rnd(HI(AC0)), *AR4 ; y(n) replaces y(n‐2)||AADD T1, AR4 ;point to next y(n‐1)MOV AC0, AC1 ;input to next biquad从代码片段可以看出,累加器AC0为Q31定标,输出数据是累加器高16位。

DSP-定点和浮点数格式解析

DSP-定点和浮点数格式解析

① 小数乘小数(n、m≠0,m≤ n) ② 整数乘小数(n≠0、m=0) ③ 整数乘整数(n=m=0)
① 小数乘小数(n、m≠0,m≤ n)
例:两个8位数相加,有溢出 进位位与最高位(MSB)不同 运算结果发生溢出,8位字长已不能正确地表示结果
10110000b( -80) + 10111111b( -65) 非饱和模式:101101111bቤተ መጻሕፍቲ ባይዱ-145)
00101001b( 41) + 01110011b(115) 非饱和模式:010011100b(156)
2)数值范围与精度
给定字长N,采用Qn格式表示小数
2 N 1 2 N 1 1 数值范围: n ~ 2 2n

度:
1
2n
16位字长Qn格式的数值范围与精度
Qn格式 Q15 数值范围 -1~0.999969482421875 精度 0.000030517578125
Q14
饱和模式:110000000b(-128)
饱和模式:001111111b(127)
溢出是由于字长有限,运算结果超出数值的表示范围引 起的
饱和模式
定点数减法运算的原理与加法运算相同
2)定点数的乘法运算
DSP处理器都有硬件乘法器和乘法指令,可实现单周期乘 法运算 二进制乘法运算包含一系列的移位和加法运算 定点数乘法运算不要求相乘数有相同的Qn格式 两个相乘数分别为Qn和Qm格式,字长为N,结果为 Q(n+m)格式,字长为2N 根据n和m的不同取值,定点数乘法运算可以分成三种情况
DSP 运算基础
• 1、 DSP的数据表示
• 2、定点数的格式与运算 • 3、浮点数的格式与运算

定点与浮点数

定点与浮点数

《例二》:x1=0.5,x2=3.1,求y=x1+x2之數值。 同樣的例子,但是把x1、x2 乘以2倍,則變成下面 的算式。 y2=(x1 × 2)+(x2 × 2)=1+6.2=7.2, 取整數為7=0111b。 ∴y=y2 >> 1=3。 >> ,右移,除2
定點數字表示法 (Conti.)
定點運算的小數點位置完全設計者的心 中,位置取決於乘上的整數值,至於要 選擇多大的整數乘上浮點數呢? 如果乘上2n的倍數,相當於將浮點數往 左位移n個位元,通常一個數字向左或向 右移動幾個位元,在運算上最為快速。 表示法
表示法所能涵蓋的範圍 -32768 ≦ x ≦ 32767 -16384 ≦ x ≦ 16383.5 -8192 ≦ x ≦ 8191.75 -4096 ≦ x ≦ 4095.875 -2048 ≦ x ≦ 2047.9375 -1024 ≦ x ≦ 1023.96875 -512 ≦ x ≦ 511.984375 -256 ≦ x ≦ 255.9921875 -128 ≦ x ≦ 127.99609375 -64 ≦ x ≦ 63.998046875 -32 ≦ x ≦ 31.9990234375 -16 ≦ x ≦ 15.99951171875 -8 ≦ x ≦ 7.999755859375 -4 ≦ x ≦ 3.9998779296875 -2 ≦ x ≦ 1.99993896484375 -1 ≦ x ≦ 0.999969482421875
減法運算
《範例》:兩個運算元都是以Q13為定點數字的表示法, x1=3.5,x2=3.1,求y=x1﹣x2之定點數值。 x1=3.5 × 8192=28672(Q13) x2=3.1 × 8192=25395(Q13) 因為兩個運算元都為相同的定點表示法,直接作減法運算。 y=x1 ﹣ x2=3277(Q13)≒0.40算元為相同的定點表示法, x1=0.5(Q15),x2=0.25(Q15),求y=x1 × x2之定點數 值,x1、x2都宣告為有號數的short。 x1=0.5 × 32768=16384(Q15) x2=0.25 × 32768=8192(Q15) y=x1 × x2=134217728(Q30), 兩個有號數的short整數相乘, 結果變成一個定點為Q30 有號數int。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第7章D S P定点数和浮点数(重要)本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。

特别是初学的一定要理解这些基础知识。

7.1 定点数和浮点数概念7.2 IEEE浮点数7.3 定点数运算7.4总结7.1定点数和浮点数概念如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。

相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。

7.1.1定点数常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。

7.1.2浮点数在计算机系统的发展过程中,曾经提出过多种方法表达实数。

典型的比如相对于浮点数的定点数(Fixed Point Number)。

在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。

货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。

由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。

SQL 中的 NUMBER 数据类型就是利用定点数来定义的。

还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。

最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。

这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。

比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中 1.2345 为尾数,10 为基数,2 为指数。

浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

提示: 尾数有时也称为有效数字(Significand)。

尾数实际上是有效数字的非正式说法。

同样的数值可以有多种浮点数表达方式,比如上面例子中的 123.45 可以表达为 12.345 × 101,0.12345 × 103 或者 1.2345 × 102。

因为这种多样性,有必要对其加以规范化以达到统一表达的目标。

规范的(Normalized)浮点数表达方式具有如下形式:±d.dd...d × βe, (0 ≤ d i < β)其中 d.dd...d 即尾数,β 为基数,e 为指数。

尾数中数字的个数称为精度,在本文中用 p 来表示。

每个数字 d 介于 0 和基数之间,包括 0。

小数点左侧的数字不为 0。

基于规范表达的浮点数对应的具体值可由下面的表达式计算而得:±(d0 + d 1β-1+ ... + d p-1β-(p-1))βe, (0 ≤ d i < β)对于十进制的浮点数,即基数 β 等于 10 的浮点数而言,上面的表达式非常容易理解,也很直白。

计算机内部的数值表达是基于二进制的。

从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。

只是此时 β 等于 2,而每个数字 d 只能在 0 和 1 之间取值。

比如二进制数 1001.101 相当于 1 × 23 + 0 × 22 + 0 × 21 + 1 × 20 + 1 × 2-1 + 0 × 2-2 + 1 × 2-3,对应于十进制的 9.625。

其规范浮点数表达为 1.001101 × 23。

7.2I E E E浮点数说明:Cortex-M4F中的FPU(浮点单元)就是用的这个IEEE 754标准,初学的要认真学习。

IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。

这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。

IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80比特实做)。

只有32位模式有强制要求,其他都是选择性的。

大部分编程语言都有提供IEEE浮点数格式与算术,但有些将其列为非必需的。

例如,IEEE 754问世之前就有的C语言,现在有包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。

该标准的全称为IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985),又称IEC 60559:1989,微处理器系统的二进制浮点数算术(本来的编号是IEC 559:1989)。

后来还有“与基数无关的浮点数”的“IEEE 854-1987标准”,有规定基数为2跟10的状况。

现在最新标准是“IEEE 854-2008标准”。

在六、七十年代,各家计算机公司的各个型号的计算机,有着千差万别的浮点数表示,却没有一个业界通用的标准。

这给数据交换、计算机协同工作造成了极大不便。

IEEE的浮点数专业小组于七十年代末期开始酝酿浮点数的标准。

在1980年,英特尔公司就推出了单片的8087浮点数协处理器,其浮点数表示法及定义的运算具有足够的合理性、先进性,被IEEE采用作为浮点数的标准,于1985年发布。

而在此前,这一标准的内容已在八十年代初期被各计算机公司广泛采用,成了事实上的业界工业标准。

在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。

这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。

具体的格式参见下面的图例:IEEE单精度浮点数1bit 8bit 38bitIEEE双精度浮点数1bit 11bit 52bit●在上面的图例中,第一个域为符号域。

其中 0 表示数值为正数,而 1 则表示负数。

●第二个域为指数域。

其中单精度数为 8 位,双精度数为 11 位。

以单精度数为例,8 位的指数为可以表达 0 到 255 之间的 255 个指数值。

但是,指数可以为正数,也可以为负数。

为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为 127,而双精度数的偏差值为 1023。

比如,单精度的实际指数值 0 在指数域中将保存为 127;而保存在指数域中的 64 则表示实际的指数值 -63。

偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -127 到 128 之间(包含两端)。

我们不久还将看到,实际的指数值 -127(保存为 全 0)以及 +128(保存为全 1)保留用作特殊值的处理。

这样,实际可以表达的有效指数范围就在 -127 和 127 之间。

在本文中,最小指数和最大指数分别用 emin 和 emax 来表达。

●图例中的第三个域为尾数域,其中单精度数为 23 位长,双精度数为 52 位长。

除了我们将要讲到的某些特殊值外,IEEE 标准要求浮点数必须是规范的。

这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。

这样我们实际上用 23 位长的尾数域表达了 24 位的尾数。

比如:对于单精度数而言,二进制的 1001.101(对应于十进制的 9.625)可以表达为 1.001101 × 23,所以实际保存在尾数域中的值为 0011 0100 0000 000 0000 0000,即去掉小数点左侧的 1,并用 0 在右侧补齐。

值得注意的是,对于单精度数,由于我们只有 24 位的指数(其中一位隐藏),所以可以表达的最大指数为 224 - 1 = 16,777,215。

特别的,16,777,216 是偶数,所以我们可以通过将它除以 2 并相应地调整指数来保存这个数,这样 16,777,216 同样可以被精确的保存。

相反,数值 16,777,217 则无法被精确的保存。

由此,我们可以看到单精度的浮点数可以表达的十进制数值中,真正有效的数字不高于 8 位。

事实上,对相对误差的数值分析结果显示有效的精度大约为 7.22 位。

参考下面的示 例:true value stored value--------------------------------------16,777,215 1.6777215E716,777,216 1.6777216E716,777,217 1.6777216E716,777,218 1.6777218E716,777,219 1.677722E716,777,220 1.677722E716,777,221 1.677722E716,777,222 1.6777222E716,777,223 1.6777224E716,777,224 1.6777224E716,777,225 1.6777224E7--------------------------------------根据标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入。

这有点像我们熟悉的十进制的四舍五入,即不足一半则舍,一半以上(包括一半)则进。

不过对于二进制浮点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。

从上面的示例中可以看出,奇数都被舍入为偶数,且有舍有进。

我们可以将这种舍入误差理解为"半位"的误差。

所以,为了避免 7.22 对很多人造成的困惑,有些文章经常以 7.5 位来说明单精度浮点数的精度问题。

提示: 这里采用的浮点数舍入规则有时被称为舍入到偶数(Round to Even)。

相比简单地逢一半则进的舍入规则,舍入到偶数有助于从某些角度减小计算中产生的舍入误差累积问题。

因此为 IEEE 标准所采用。

7.2.1规范化浮点数通过前面的介绍,大家应该已经了解的浮点数的基本知识,这些知识对于一个不接触浮点数应用的人应该足够了。

相关文档
最新文档