浮点数
来源:互联网 发布:淘宝卖海鲜干货手续 编辑:程序博客网 时间:2024/04/29 08:56
人们研制电子计算机的初衷就是为了用于科学计算。时至今日,尽管现在单片机应用领域宽广、色彩缤纷,但复杂计算仍不可或缺的内容。
针的对定点数不能胜任复杂计算的缺点,人们在实践中约定了不同格式、不同精度的浮点数,实现了浮点运算。因为计算机只能识别二进制数,完成二进制数的运算,所以我们所说的浮点数一般都是指二进制浮点数。与定点数相比,浮点数能较好地兼顾表达式数值范围,能简捷地表示出很大或很小的数值。
浮点由阶码和尾数两部分组成,阶码为带符号的整数,尾数为小于1带符号的小数(如尾数的绝对值还满足大于或等于1/2,则称该浮点数为规格化浮点数)。计算过程中主要以足够长的尾数来保证数据的精度,以阶杩来调整数模(绝对值)的大小(即改变小数点的位置),并自动进行符号处理。因此浮点数具有精度高、数的表达范围宽等特点,特别适用于计算过程复杂、精度要求高的场合。
目前单片机常用的浮点数格式,不外乎有四种格式:三字节格式、IEEE-754标准格式、IEEE-754标准变形1和IEEE-754标准变形2,
共4种格式。
单片机浮点数格式说明
★ MCS-51三字节格式:
浮点数格式如下:
地址 eb BY0 BY1
内容 SEEE EEEE MMMM MMMM MMMM MMMM
用三个字节表示,第一个字节的最高位为数符S,正数为0,负数为1,其余七位为阶码(二进制补码形式);第二字节为尾数的高字节;第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。
例:已知 a=-123.4;b=0.7577;c=56.34;d=1.276;
用BCD码浮点数表示时,分别为a=831234H;b=007577H;c=025634H;d=011276H。
★ MCS-51三字节浮点数规格化:
为了提高运算精度,正数的尾数最高位规定为1,负数的尾数的最高位规定为0,这种形式的浮点数为规格化数(又称浮点操作数)。运算之前所有的浮点数都应转成规格化数。
*************************************************************
★ IEEE-754标准的格式:
一个浮点数用两个部分表示,尾数和2的幂,尾数代表浮点上的实际二进制数,2的幂代表指数,指数的保存形式是一个0到255的8位值,指数的实际值是保存值(0到255)减去127,一个范围在-127到+128之间的值,尾数是一个24位值(代表大约7个十进制数),最高位MSB通常是1,因此省略不保存,一个符号位表示浮点数是正或负。
地址 eb BY0 BY1 BY2
内容 SEEEEEEE E.MMMMMMM MMMMMMMM MMMMMMMM
S (第31位)代表符号(数符)位1是负,0是正;
E 偏移127的幂,二进制阶码=(EEEEEEEE)-127;
. 小数点;
M 24位的尾数保存在23位中,只存储23位,隐含最高位1。此方法用最较少的位数实现了较高的有效位数,提高了精度。
零是一个特定值,幂是0 尾数也是0。
阶码的计算方法:
阶码采用指数的移码,阶码= 指数P+7FH
阶码(移码)eb=指数P+7FH
其中:指数P=int(Z),Z=ln(A)/ln(2)
由1位符号位、8位指数、23位有效数组成。
能表示的数据范围为:±1.2×10^(-38)~3.4×10^38,超出范围为溢出。
精度为2-24 即5.9× 10-8。
-------------------------------------------------------------
如果eb=P+7EH,那么指数P=int(Z)+1 ,
(广洲天龙AVR单片机浮点数格式定义的移码为7EH,而IEEE-754标准定义的是7FH,故我们取移码为7FH)
-------------------------------------------------------------
* 在由二进制浮点数转为十进制定点数时,注意在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,但在还原时应加上去。
**************************************************************
★ IEEE-754_1标准的格式:
地址 eb BY0 BY1 BY2
内容 PtEEEEEEE S.MMMMMMM MMMMMMMM MMMMMMMM
Pt 代表阶符,阶符视阶的正负而定;
S 代表符号(数符)位,1是负,0是正;
. 小数点在数符的右边;
E 代表幂偏移,即指数偏差;
M 24位的尾数保存在23位中,只存储23位,隐含最高位1。
阶码的计算方法:
(1)十进制整数(可带小数):
阶码eb=指数P+7EH
其中:指数P=int(Z)+1,Z=ln(A)/ln(2)
(2)纯小数:
阶码eb=指数+7EH
其中:指数P=int(Z),Z=ln(A)/ln(2)
注:IEEE-754_1主要用于PIC系列单片机浮点数格式
***************************************************************
★ IEEE-754_2标准的格式:
地址 eb BY0 BY1 BY2
内容 PtEEEEEEE S.MMMMMMM MMMMMMMM MMMMMMMM
Pt 代表阶符,阶符视阶的正负而定;
S 代表符号(数符)位1是负,0是正;
. 小数点在数符的右边;
E 代表幂偏移,即指数偏差;
M 24位的尾数保存在23位中,只存储23位,隐含最高位1。
阶码采用1字节移码,以80H~0FFH表示0~127,以01H~7FH表示-127~-1。
阶码的计算方法:
(1)十进制整数(可带小数):
阶码eb=指数P+80H
其中:指数P=int(Z)+1,Z=ln(A)/ln(2)
(2)纯小数:
阶码eb=指数+80H
其中:指数P=int(Z),Z=ln(A)/ln(2)
能表示的数据范围为:5.8×10^(-39)~1.7×10^38,超出范围为溢出。
---------------------------------------------------------------
注:Pt 表示阶符,Pt=0表示阶码为正数;Pt=1表示阶码为负数
(如0.1的阶为-3,则 阶码=(-3)+ 80H=7DH )
IEEE-754_1与IEEE-754_2只是阶码字节的内容不同,而尾数的内容是相同的。
----------------------------------------------------------------
例:十进制数50.265化为32位规格化浮点数。
解 A=50.265,则Z=ln50.265/ln2,P=int(Z)+1,故P=6;
X=A/2P=50.265/26=0.785390625,将定点小数:0.785390625 转为二进制数为:
1100 1001 0000 1111 0101 1100B, 取其24位,检查24位是否为1,否则,将二进制数左移,直至二进制数的最高位为1;隐含尾数整数的1,将二进制数的最高位改为数的数符位(正数为0,负数为1)。
则:0100 1001 0000 1111 0101 1100B = 49H,0FH,5CH;
而阶码eb=P+80H=6+80H=86H
二进制浮点数为:86H, 49H,0FH,5CH
****************************************************************
★ 浮点BCD码的格式:
浮点BCD码,是以纯小数(原码)来表示。小数点的位置由阶来确定。
[阶符.阶码],数符.尾数(4字节),即带符号的阶码与带符号的尾数。
阶符:正数为“+”,可隐含;负数为“-”;
数符:正数为“+”,可隐含;负数为“-”;
阶码:根据小数点的位置来确定。
0.1-->阶符为“+”,数符为“+”,阶为00
0.01-->阶符为“-”,数符为“+”,阶为01
22.00-->阶符为“+”,数符为“+”,阶为02
-0.1-->阶符为“+”,数符为“-”,阶为00
-0.01-->阶符为“-”,数符为“-”,阶为01
-22.00-->阶符为“+”,数符为“-”,阶为02
阶-->这里所说的阶是十进制浮点数的阶,即为小数点的位置。“+”阶小数点的位置向右移;“-”阶小数点的位置向左移。
如: [阶符.阶码],数符.尾数
-0.012345678,浮点BCD码为:[-01],-12345780H
0.012345678,浮点BCD码为: [-01],12345780H
0.12345678,浮点BCD码为: [00],12345780H
12345678,浮点BCD码为: [08],12345780H
-12345678,浮点BCD码为: [08],-12345780H
------------------------------------------------------------
注:在单片机编程中定义为:
阶符:正阶为00H,负阶为FFH
数符:正数为00H,负数为FFH
为了与人们的习惯相一至,在这里仍采用“+,-”号来表示。
**************************************************************
★ 浮点数错误判断及提示:
以下是IEEE-754标准所能表达数据的范围,其它标准请参照,只溢出的范围有所不同而已。
FFFFFFFH 不是一个数,提示:"输入有误"
7F80000H 正无穷大正溢出,提示:"正溢出"
FF80000H 负无穷大负溢出,提示:"负溢出"
附注:
(1)IEEE标准是美国电子电气工程师协会定义的国际标准浮点数格式;
(2)符号-表示数据的正负,在最高有效位(MSB)。负数的符号位为1,正数的符号位为0;
(3)有效数字-表示数据的有效数字,反映数据的精度。有效数字一般采用规格化形式,是一个纯小数,所以也被称为尾数、小数或分数。
(4)阶码与阶之间的换算公式为:移码(阶码)=补码(阶)+偏移量;阶=移码-偏移量
其中阶又称为指数;移码又称偏移码;80H(或7FH)为偏移量。
*********************************************************************************************************************
四种浮点数对照表
输入数 据
51 三字节
IEEE-754 标准
IEEE-754_1
IEEE-754_2
0
000000H
00000000H
0000 0000H
0000 0000H
1
018000H
3F800000H
81000000H
-1
818000H
81800000H
0.5
008000H
3F000000H
80000000H
-0.5
808000H
80800000H
0.1
7DCCCDH
7D4CCCCDH
-0.1
FDCCCDH
7DCCCCCDH
π /180
7B8EFAH
7B0EFA35H
Ln 2
00B172H
80317218H
01B505H
813504F3H
E ≈ 2.7182818
02ADF8H
822DF854H
90
07B400H
87340000H
10 -10
5FDBE7H
5F5BE6FFH
10 10
229503H
A21502F9H
88.02969
07B00FH
87300F34H
π /2
01C910H
81490FDAH
100.25
07C880H
42C88000H
87488000H
50.265
06C90FH
84490F5CH
86490F5CH
-5
83A000H
C0A00000H
83A00000H
-12.5
C1480000H
84C80000H
-12.345
C145851EH
-----------待续-------------
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 浮点数
- 在Ubuntu上安装Ruby
- Print Spooler服务对打印的影响
- 设计新一代的网游——(网游现存问题及解决方法)
- 常见的C字符串处理函数的源代码
- ActiveX技术综述
- 浮点数
- 一种安全便捷的OA集成动态口令方案
- 交互式 Ruby Shell irb
- Database of Public Bus Service Simulator(Source Code)
- linux中五个不常用的命令
- javascript与asp.net实现文件上传
- s3c24xx-pcm.c的打印信息,参考下。这是open->write->close的完整过程
- SQL Server备份读写揭秘
- 一种便捷的利用动态口令技术保护VPN登录安全方案