浮点数float和double的精度

浮点数的实质是科学计数法,其规定为:尾数是纯小数。
计算机浮点数科学计数法:z = x * 2^y
x为尾数,y为阶码;
x是定点数,且小数点在首部,y是定点数,且小数点在尾部;
x的高一位是符号位,小数点,在高一位和高二位之间,且是补码;y的高一位是符号位,小数点在末位后面;




在计算机中,阶码被放在尾数的前面:
设有八位浮点(3.5):阶码为3位补码,尾数为5位定点纯小数
eg:(1101 0011)浮(3.5)
y  = (110)补 = (110)原 = (110)2 = -2
x  = (1.0011)补 = (1.1101)原 = -(0.1101)2 = -13 * 2^(-4)
z = x * 2^y = -13 * 2^(-4) * 2^(-2)  = -13/64


已知:c语言中float类型是浮点数,且其有效位数(精度)为7位十进制,求其表达数值的范围?


解:x是有效位数的表达部分,由于x是二进制纯小数,且为补码:
设:有尾数:(0.0*******01)(一共m位,*号为省略号,为了区分小数点)
= (0.0****01)2 // 2代表二进制
= 2 ^-(m-1) = 10^(-t) // 10^(-t)代表用十进制表示的精度为t位
t = (m-1)lg2 lg2 ≈ 0.3 // 后面就用0.3代替
t = 7 => m  ≈ 24
又知float为4字节类型,即32位浮点,则阶码为8位,最高位为符号位,其所能表达的最大正整数为:2^7,即y = 2^7,而x的最大值约为1(0.11***1)<23个1>,所以z = x * 2^y = 2^128 
设能表达的取值范围用十进制表达为10^h,则 2^128 = 10^h,解得h约为38,所以float类型所能表达的最大十进制数为10^38






已知:c语言中double类型数据可表达10^308范围的数值,求其精度(有效位数)


解:当尾数约等于1,阶码为最大整数时,可表示最大数值
此时 z = 1 * 2 ^y = 10^308
y ≈ 1027
设:阶码有t位,则 2^(t-1) = y = 1027(最高位为符号位) t ≈ 11,所以阶码为11位,
double共8字节,即64位,尾数有53位,且为定点纯小数补码,其能表达的最精确数的形式为:(00...01)补,(53位) = (0.0***01)2 = 2^(-52) = 10 ^h
h ≈ 15,即double有效位数为15位


定点数由于固定小数尾数,因此不便表示数值,或者表达范围受限,或者表达精度受限,但其优点在于加减法运算方便;
浮点数用科学计数法表示以后,可以同时满足精度和范围的双重要求,但对于加减法运算存在对阶问题;
对阶问题:如要计算 0.24 * 10^14 + 0.24 * 10^(-14)
必须要先转变为:0.24 * 10^14 + 0.0000000000000024 * 10^14
结论:浮点数加减法速度不如乘除法快。























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值