C语言拾遗-C语言数据类型-浮点型

摘要:变量的三个基本属性为--作用域、链接属性和存储类型。这三个属性决定变量的可视性和生命期。在C语言中,仅有4种基本数据类型--整型、浮点型、指针和聚合类型(如:数组和结构体)。所有其他的类型都是从这4种基本类型的某种组合派生而来。

浮点型

浮点数家族包括float、double和long double类型。通常,这些类型分别提供单精度、双精度以及在某些支持扩展精度的机器上提供扩展精度。ANSI标准仅仅规定:long double长度>=double长度>=float长度。标准同时规定了一个最小规范:所有浮点数至少能够容纳从10^{-37}10^{37}之间的任何值。

头文件float.h定义了名字FLT_MAX、DBL_MAX和LDBL_MAX,分别表示float、double和long double所能存储的最大值。而FLT_MIN、DBL_MIN和LDBL_MIN则分别表示float、double和long double所能存储的最小值。这个文件另外还定义了一些和浮点值实现有关的某些特性的名字,例如浮点数所使用的基数、不同长度的浮点数的有效数字的位数等。

浮点数在计算机中的表示方法

把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示。这种把数的范围和精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。

在计算机中一个任意二进制数N可以写成: N=2^e.M

其中M称为浮点数的尾数,是一个纯小数。e是比例因子的指数,称为浮点数的指数,是一个整数。比例因子的基数2对二进记数制的机器是一个常数。

在机器中表示一个浮点数时,一是要给出尾数,用定点小数形式表示。尾数部分给出有效数字的位数,因而决定了浮点数的表示精度。二是要给出指数,用整数形式表示,常称为阶码,阶码指明小数点在数据中的位置,因而决定了浮点数的表示范围。浮点数也要有符号位。

符号位 阶码 尾数
S E M

按IEEE754标准,32位浮点数和64位浮点数的标准格式为

不论是32位浮点数还是64位浮点数由于基数2是固定常数,对每一个浮点数都一样,所以不必用显示方式来表示它。

32位的浮点数中,S是浮点数的符号位,占1位,安排在最高位,S=0表示正数,S=1表示负数。M是尾数,放在低位部分,占用23位,小数点位置放在尾数域最左(最高)有效位的右边。E是阶码,占用8位,阶符采用隐含方式,,即采用移码方法来表示正负指数。移码方法对两个指数大小的比较和对阶操作都比较方便,因为阶码域值大者其指数值也大。采用这种方式时,将浮点数的指数真值e变成阶码E时,应将指数e加上一个固定的偏移值127(01111111),即E=e+127。

为了提高数据的表示精度,当尾数的值不为0时,尾数域的最高有效位应为1,这称为浮点数的规格化表示。否则以修改阶码同时左右移动小数点位置的办法,使其变成规格化数的形式。

在IEEE754标准中,一个规格化的32位浮点数x的真值表示为
x = (-1) ^s X(1.M)X 2^(E-127)
e = E - 127
其中尾数域所表示的值是1.M。由于规格化的浮点数的尾数域最左位(最高有效位)总是1,故这一位经常不予存储,而认为隐藏在小数点的左边。于是用23位字段可以存储24位有效数。

64位的浮点数中符号位1位,阶码域11位,尾数域52位,植树偏移值是1023.因此规格化的64位浮点数x的真值为
x = (-1)^s X(1.M)X 2^(E-1023)
e = E - 1023

例题
1. 问题: 若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值。
解:将16进制数展开后,可得二进制数格式为

指数e=阶码-127=10000010-01111111=00000011=(3)_{10}(3)^{_{10}}3_{10}
包括隐藏位1的尾数1.M=1.011 0110 0000 0000 0000 0000=1.011011
于是有
x=(-1)^S X 1.M X 2^e=+(1.011011) X 2^3 = +1011.011=11.357_{10}

2. 问题: 将数(20.59375)10转换成754标准的32位浮点数的二进制存储格式。
解:首先分别将整数和小数部分转换成二进制数:
20.59375 = 10100.10011
然后移动小数点,使其在第1、2位之间
10100.10011 = 1.010010011 X 2^4 e = 4
于是得到
S = 0, E = 4 + 127 = 131, M = 010010011
最后得到32位浮点数的二进制存储格式为
0100 0001 1010 0100 1100 0000 0000 0000 = 41A4C000_{16}

参考链接

  1. 《C与指针》第三章
  2. https://blog.csdn.net/m0_37482190/article/details/87218019

你可能感兴趣的:(C语言)