单精度数,是指计算机表达实数近似值的一种方式。VC中,Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38 。
符号位S(sign) - 1bit
0代表正号,1代表负号。
指数位E(exponent) - 8bit
E的取值范围为0-255(无符号整数),实际数值e=E-127。
有时E也称为“移码”,或不恰当的称为“阶码”(阶码实际应为e)
尾数位M(mantissa) - 23bit
M也叫有效数字位(sinificand)、系数位(coefficient), 甚至被称作“小数”。
在一般情况下,m=(1.M)2,使得实际起作用范围为1≤尾数<2。
为了对溢出进行处理,以及扩展对接近0的极小数值的处理能力,IEEE 754对M做了一些额外规定,参见后文介绍。
对于内部存储数据(00111111 01100110 01100110 01100110)2:
符号位
(最左侧)S=0。这表示是个正数
指数
(左侧第2-9位)E=(01111110)2=(126)10,所以s=S-127=-1。
尾数
(最后的23位)M=(1100110 01100110 01100110)2,
m=(1.M)2=(1.7999999523162841796875)10
该二进制小数转为10进制的计算方式为1 + (1/2+1/4) + (1/32+1/64) + (1/512+1/1024)……
实际值
N=1.7999999523162841796875*2^-1=0.89999997615814208984375
(其实,这个数据是0.9的单精度浮点数的实际内部存储,可以看到有一定的误差)
float单精度型,在内存中占4个字节(32位),有效数字是7位十进制数字(小数点算一位,小数点后6位。)。
double双精度型,在内存中占8个字节(64位),有效数字是15位十进制数字。
单精度浮点数的表示范围及说明
表示范围
最大表示范围:单精度浮点数可以表示的范围为±3.40282 * 10^38(1)2*2^127)
接近于0的最小值:单精度浮点数可以表示1.175 * 10^-38(0)2*2^-126)的数据而不损失精度。
当数值比以上值小的时候,将会由于尾数的有效位数减少而逐步丧失精度(IEEE 754的规定),或者有的系统则直接采用0值来简化处理过程。
精度
单精度浮点数的实际有效精度为24位二进制,这相当于 24*log102≈7.2 位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从(0)2变化为(1)2时,变动范围为2-23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2-24的数值变化,即24位二进制精度)
阶码值0和255分别用来表示特殊数值:当阶码值为255时,若分数部分为0,则表示无穷大;若分数部分不为0,则认为这是一个‘非数值’。当阶码和尾数均为0时则表示该数值为0,因为非零数的有效位总是≥1,因此特别约定,这表示为0。当阶码为0, 尾数不为0时,该数绝对值较小, 允许采用比最小规格化数还要小的数表示浮点数7位有效数字。双精度数16位有效数字。
浮点数取值范围:
负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 3.4028235E+38。
双精度数取值范围:
负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。
浮点数的表示遵循IEEE 754标准。
一个浮点数由三部分组成:符号位S、指数部分E(阶码)以及尾数部分M(如下)。
Floating
S--------E-------M
1位-----8位-----23位
Double
S--------E-------M
浮点型变量float1位-----11位----52位
十进制数的换算计算公式为(n^m表示n的m次幂,B表示前面的数字是二进制):
S * 2^(E-127) * (1.M)B
S * 2^(E-127) * (1.M)B
浮点数的精度取决于尾数部分。尾数部分的位数越多,能够表示的有效数字越多。
单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。
双精度的尾数用52位存储,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论