C语言中浮点数表示范围浅析
C语言中浮点数表示范围浅析
摘 要:浮点数是C语言中的一种数据类型,但在标准C中并没有给出其具体的描述,即数的存储格式及表示范围。部分经典的C语言程序设计教程中给出了浮点数的表示范围,但存在不严谨和值得商榷的地方。结合IEEE754标准,就C语言中浮点数内在存储格式进行分析并给出结论。
关键词:C语言;浮点数;表示范围
中图分类号:TP313 文献标识码:A
Abstract:The float is a data type in C language,but its in standard C and did not give a specific of description:that is the number of storage format and the scope of representation.Part of classically C language programming tutorial gives a range of floating-point represent,but there is not rigorous and need to discussion.Combined IEEE754 standards,provided analyzation and conclusions in C language in internal storage floating-point format.
Keywords:C language;floating-point;scope of representation
1 引言(Introduction)
浮点数运算是科学计算必须面对的问题,由于计算机内部本身不能精确地处理某些整数或小数,因此在运算时可能存在较大的误差,运算结果将直接影响到系统的可靠性和安全性等。C语言因功能强大、程序设计灵活且支持底层应用,在科学计算、数据处理等领域中得到了广泛应用,但C语言在浮点数运算方面也存在数据表示的不精确性等问题。经典C语言并没有对浮点数专门说明,国内很多教材虽述及浮点数,但也只是给出表示范围,对于浮点数的解释尚不够充分,描述尚不够严谨,因此学生在对浮点数的学习过程中经常存在这样或那样理解上的困惑。这里就浮点数的表示范围,结合IEEE754做进一步的分析,为以后浮点数教学和学习给出参考[1]。
2 浮点数的表示及范围(The range of floating-point and representation)
总体而言,浮点数的表示形式一般格式指满足一般的二进制数机器码(包括定点整数和定点小数)的规定规则;而IEEE754[2]格式则在一般格式上进一步做了一些约定,以便表示数时比较方便和高效。
(1)一般表示法
其主要有两种格式,分别如图1和图2所示。
一般浮点数尾数采用纯小数(隐含位为0)来表示,即尾数M与定点小数表示方法相同,由于尾数的符号位决定整个浮点数的符号,故有时采用图2的形式;当尾数真值为0(不论阶码何值),或阶码的值比能在机器中表示的最小值还小,计算机把该浮点数看成零值,称为机器零,即浮点数表示不了真值绝对值很接近0的数,只能看成0处理;尾数通常用原码或补码表示,阶码一般用移码或补码表示。因此其表示范围如图3所示。
3 C语言中浮点数的表示(C language representation of floating point numbers)
C语言所使用的浮点数符合IEEE754标准,该标准在1985年审核通过,目的是让遵守IEEE标准的机器之间运行的程序可以相互直接移植,另外也让程序员可以轻松写出有用的、鲁棒的浮点数应用程序。
3.1 IEEE754
IEEE标准从逻辑上用三元组{S,E,M}表示一个数N[3],如图4所示。
IEEE标准754规定了三种浮点数格式:单精度、双精度、扩展精度,分别对应C语言里头的float、double和long double。不同的编译系统对long double型的处理方法不同,Turbo c分配16个字节,而Visual C++6.0则分配8个字节。
单精度:N共32位,其中S占1位、E占8位、M占23位,如图5所示。
M虽然是23位或者52位,但它们只是表示小数点之后的二进制位数,也就是说,假定 M为“010110011...”,在二进制数值上其实是“.010110011...”。而事实上,标准规定小数点左边还有一个隐含位[4],绝大多数情况下是1,当N对应的n非常小的时候,比如小于2^(-126)(32位单精度浮点数),于是M对应的m最后结果可能是“m=1.010110011.