C语言复习(第三课浮点数的秘密)

1.10进制浮点数的内存表示


 举个例子:float类型的8.25在内存中的表示

                   第一步:转化为2进制表示 1000.01

                   第二步:转化为指数形式    1.00001 * 2^3

                   第三步:转化为float类型表示形式 (注意* float类型算指数位时需要将之前的指数位加127, double类型算指数位时需要将之前的指数位加1023) 

                                符号位: 0

                                指数位: 127 + 3 = 130 = 1000 0010

                                尾数位:00001(剩下的补零)

所以算出的值转化为16进制数为0x41040000,这里我们用程序验证下

(在这里有我一个不懂的知识点,这里记录下。去看float的十六进制数,用的是unsigned int类型的指针,为什么不用float类型指针呢?因为%X,它表示的是显示十六进制数,08表示8位,只能用unsigned int类型如果用了其他类型会出现以下错误

2.浮点数的精度问题

    因为浮点数是符号位+指数位+尾数位表示的所以并不是一个连续的数例如:

   虽然给的值是123456789但是实际是123456792

3.给一道笔试题

   (不定项选择题)以下数字在表示为double(8字节的双精度浮点数)时存在舍入误差的有()

    A. 2的平方根

    B. 10的30次方

    C. 0.1

    D. 0.5

    E. 100


A是一个无尽的数,所以A是;B 10^30 = 2^30 * 5^30  其中2^30说明指数位够,5^30 > 2^52,说明尾数位不够,所以B是;C因为2^-n都不可能是0.1所以也有误差,C是

最后感谢下狄泰软件学院的唐老师

猜你喜欢

转载自blog.csdn.net/qq_35570735/article/details/80300727