欢迎来到天天文库
浏览记录
ID:45686228
大小:38.50 KB
页数:3页
时间:2019-11-16
《浮点数在内存中的表示》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、浮点数的表示VB、C/C++的浮点数据类型有single(float)和double两种。 类型single(float)占4字节,即32位,格式如下:高位低位
2、 符号位
3、 阶码
4、 尾数
5、
6、 1bit
7、 8bit
8、 23bit
9、类型double占8字节,即64位,格式如下:高位低位
10、 符号位
11、 阶码
12、 尾数
13、
14、 1bit
15、 11bit
16、 52bit
17、符号位决定浮点数的正负,0表示正,1表示负。阶码和尾数均从二进制科
18、学计数形式中获取。如,十进制数8.25的二进制形式为1000.01,转换为规格化的科学计数法形式为(1.00001)*(23),其整数部分必须是1,由此推得指数为3(二进制11),尾数(即科学计数法的小数部分)为00001。根据浮点数的存储标准(IEEE制定),single(float)类型阶码(指数)的起始数为127(二进制01111111),double类型阶码(指数)的起始数为1023(二进制01111111111),在此基础上加指数得到的就是阶码的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。整数部分1隐含不填,所以float和double类型分别
19、表示的8.25如下(二进制):single(float)
20、符号位
21、 指数
22、 尾数
23、 0
24、10000010
25、00001000000000000000000十六进制41040000double
26、符号位
27、 指数
28、 尾数
29、 0
30、10000000010
31、0000100000000000000000000000000000000000000000000000十六进制4020800000000000十进制数8.25可以用二进制小数准确表示,但很多小数不可以准确表示,其二进制形式的小数部分会无限循环,如-1.2表示如下
32、(二进制):single(float)
33、符号位
34、 指数
35、 尾数
36、 1
37、01111111
38、 00110011001100110011010 double
39、符号位
40、 指数
41、 尾数
42、 1
43、01111111111
44、0011001100110011001100110011001100110011001100110011由于对无限循环尾数的截取遵循0舍1入。-1.2的single(float)形式,最后三位因进位而成010,得到的是过剩近似值;而-1.2的double形式则没有进位发生,得到的是不足近
45、似值。 类型single(float)和double通过==,>,<等比较不会引起编译错误,但是非常可能得到错误的结果。这是因为它们的格式不同,不可以直接比较。正确的方法是转换为同一类型后比较两者差值,如果结果小于规定的小值,则视为相等。实数0.0无论single(float)和double形式均以全“0”字节表示。参考:1)IEEE浮点数标准: 4字节浮点数:1位符号位,8位阶码(基数为127的移码),23位尾数;8字节浮点数:1位符号位,11位阶码(基数为1023的移码),52位尾数2)在VB、VC中:float数值范围约在-10e38~10e38,并提供7位有效数字位,绝
46、对值小于10e38地数被处理成零值double数值范围约在-10e308~10e308,并提供15~16位有效数字,绝对值小于10e308地数被处理成零值最后提供一个笔者用VC++编的小程序,可将双精度类型的数据转化成字符数组,再输出每个字节的十六进制值,即可知道数据在内存中是如何存储的,读者可自行改变数据类型以适应不同的情况。注:在PC系列计算机中数据的低字节在前高字节在后。#includeunionfp_char{unsignedcharc[8];doublef;}fui;main(){fui.f=8.25;printf("%x",fui.c[0]);pri
47、ntf("%x",fui.c[1]);printf("%x",fui.c[2]);printf("%x",fui.c[3]);printf("%x",fui.c[4]);printf("%x",fui.c[5]);printf("%x",fui.c[6]);printf("%x",fui.c[7]);return0;}
此文档下载收益归作者所有