前言
浮点数,是一个计算机科学术语,指一种既包含小数又包含整数的数据类型。数据在内存中都是用
0与1存储,而浮点型这样包含小数部分的数据类型,由于计算机字长的限制,当需要表示的数据有很大的数值范围时,他们不能直接用定点小数或者定点整数表示。
提示:以下是本篇文章正文内容,下面案例可供参考
一、常见的浮点数
3.1415
2E10
浮点型:float double
二、浮点数储存示例
代码如下:
int
main
()
{
int
n
=
2
;
float *
p
=
(
float *
)
&
n
;
printf
(
"n
的值为:
%d\n"
,
n
);
printf
(
" *p
的值为:
%f\n"
,
*
p
);
*
p
= 2
.0
;
printf
(
"n
的值为:
%d\n"
,
n
);
printf
(
"*p
的值为:
%f\n"
,
*
p
);
return
0
;
}
如果不了解浮点型在内存中是怎么存储的,一般会认为结果依次为2 2.0f 2 2.0f
而实际结果:
结果中有2个难以用整型或者其他数据储存的原理去解释,要解释清楚,必须了解国际标准IEEE(电气和电子工程协会) 754
三 、IEEE745标准
根据IEEE745,任何一个二进制浮点数V可以表示成下面的形式:
其中:
(-1)^ S 表示符号位,例如,S=1, 表示负数,S=0,表示正数。
M
表示有效数字,是
二进制位数
,大于等于
1
,小于
2
。
2^E
表示指数位,并且E为
无符号整数
。
举例说明:
V = 4.5 ,二进制表示为100.1 , 按照标准,S = 0 ,M=1.001, E=2;
这
仅仅是
数学意义上的表达,还要进一步转化到内存上
IEEE 745规定:
参数 | 所占bit数(对于32位) | 对于bit位数的二进制值 |
S | 1bit | S |
M | 23bit | 只取小数点后的位数,剩余位补0 |
E | 8bit | E+=127, 再转化为二进制 |
参数 | 所占bit数(对于32位) | 对于bit位数的二进制值 |
S | 1 | S |
M | 11bit | 只取小数点后的位数,剩余位补0 |
E | 52bit | E+=1023, 再转化为二进制 |
对于M:
IEEE 754
规定,在计算机内部保存
M
时,默认这个数的第一位总是
1
,因此可以被舍去,只保存后面的xxxxxx部分。
比如保存
1.01
的时 候,只保存01
,等到读取的时候,再把第一位的
1
加上去。
这样做的目的,是节省1位有效数字。
以
32
位 浮点数为例,留给M
只有
23
位, 将第一位的1
舍去以后,等于可以保存
24
位有效数字.
对于E:
IEEE745规定:
现在我们可以解释示例了:
n以整型形式存入内存为 :00000000000000000000000000001001,以%d形式输出,结果为9
float *
p
=
(
float *
)
&
n
;*p 把n的内存视为浮点型:0 00000000 00000000000000000001001
此时, S=0,
E为全零,M=00000000000000000001001
以%f形式输出,S=0, E=-126, M =
0.00000000000000000001001 , 结果为0;
*p = 2.0,以浮点型存入: S=0, M=001.0, E=1
转为二进制(E+=127): 0 10000000 00000000000000000000000
以n的角度输出,视为补码,又因为是正数,补码为原码,直接输出十进制数:1037741824
才疏学浅,疏漏百出,如有问题,欢迎指出