1.为何称为浮点数
对于一个浮点数来说,其通常可以科学计数法来表示,而对于一个浮点数来说,由于次方可变,故小数点可以左右移动。
eg:-36.5 ,及可以表示为:,也可以表示为
,故称为浮点数。
2.十进制浮点数以及规范化
在十进制数中,,如 -36.5,可以表示为 。
其中 - 表示符号, 指数2 表示阶或阶码,0.365是小数部分,小数部分称为尾数,从左边非零数到右边数字非零数字所包含的最长数列称为有效值,此处为365。
为了统一规范,十进制浮点数规范化要求,写成小数点前不含有效数字,小数点后一位为非零数,如上例所示。
3.十进制浮点数和二进制的转换
在计算机内部,浮点数是以二进制的方式保存。对于十进制浮点数转换成二进制,我们知道,整数部分利用除2取余法,小数部分利用乘2取整法。
4.二进制浮点数以及规范化
二进制中的阶等概念同十进制一样,但是在规范化上并不相同。
首先,我们要知道,在计算机内部,浮点数是以国际标准IEEE754形式表示的。即,分三部分,第一部分占一位,表示正负,第二部分,占8位或者11位表示阶数,第三部分为尾数。
上图所示,分别为32为浮点数(float)和64位浮点数(double)格式
二进制浮点数规范化要求:进制浮点数整数部分要求为1,eg:0.8125 =0.1101 =,也就是将1左移了一位。
如果按照十进制的规范化,要求小数点后为非0,那么在任意一个二进制浮点数中,只能是1,而1会称为尾数的第一个数字,尾数就会被占据一位,失去宝贵的一位精度,因此为提高精度,故将1左移一位,这样,23位尾数,后面就会补上一位,也就是24位精度。
5.二进制浮点数的阶码以及机内表示
标准32位浮点数的阶码范围为-126---127,因为c++中,-127和-128分别表示阶码为-126的非规格化数和NaN(非法操作的数)。所谓非规格化数,也就是按照十进制规格来表示的,整数部分不为1,1在尾数的首位,包含在尾数中。
浮点数在计算机内表示为,
eg:35.6 = 10011.1001 = 1.00011 100110011001100110
那么它在计算机内部表示为什么呢? 根据规格,符号位为正,故为0, 阶数为5(单精度精度浮点数,对规格化和非规格化的阶数,均加127,做偏移操作,而在取出浮点数时,再减去127),故5+127 ,表示为10000100,最后尾数部分,取23位尾数即可,00011 100110011001100110 (最后一位要取四舍五入,别忘了进位,比如此处最后一位为0,其后为0,四舍五入,最后任然为0,若最后位0,其后为1,舍去要进1).
6.浮点型表示范围(有效位数)
以上绝大部分源于钱能c++程序设计,为读后总结