type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态
浮点数的表示
浮点数表示法是指以适当的形式将比例因子表示在数据中,让小数的位置根据需要而浮动。这样既扩大了数的表示范围,又保持了数的有效精确度。
- 浮点数的表示格式
N = × M ×
S取值为0或者1,用来决定浮点数的符号;M是一个二进制定点小数,称为尾数,一般用定点原码小数表示;E为一个二进制定点整数,称为阶码或指数,用移码表示。R是基数(隐含),可以约定为2、4、16等。
即浮点数由符号、尾数和阶码三部分组成。

- 浮点数的表示范围
浮点数和原码相同,都是关于原点对称的。

若运算结果大于最大正数时称为上溢出,小于绝对值最大负数时称为负上溢,两者统称为上溢。当运算结果在0至最小正数之间时称为正下溢,在0至绝对值最小负数之间时称为负下溢。两者统称下溢。
- 浮点数规格化
通过调整一个非规格化浮点数的尾数和阶码的大小,使非零浮点数在尾数定点最高位上保证是一个有效值。
左规:当运算结果的尾数的最高数位不是有效位,即出现士0.0...0×...的形式时,需要进行左规。左规时,尾数每左移一位、阶码减1(基数为2时)。左规可能要进行多次。
右规:当运算结果的尾数的有效位进到小数点前面时,需要进行右规,右规只需进行一次。将尾数右移一位、阶码加1(基数为2时)。右规时,阶码增加可能导致溢出。
- IEEE 754标准
此标准下的浮点数格式如下:


单精度格式中包含1为符号s、8位阶码e和32位尾数f;双精度格式包括一位符号位s、11位阶码 e和52为尾数f。基数隐含为2。
对于规格化的二进制浮点数,尾数的最高位总是1.为了能使尾数多一位有效位,将这个1隐藏,称为隐藏位,因此23位尾数实际表示了24位有效数字。
在IEEE 754规定隐藏位1的位置在小数点之前
如: ,将其规格化后为 1.1× ,其中整数部分的1将不存储在23位尾数内。
规格化单精度浮点数的阶码e的表示范围位1~254(8位);规格化双精度浮点数的阶码e的取值范围为1~2046(11位)。
阶码全为0或全为1的特殊意义:


- 全0阶码全0尾数:+0/-0。零的符号却决于符号s,一般情况下两者相等。
- 全1阶码全0尾数:+∞/-∞
- 全1阶码非0尾数:NAN。无定义,为非数。
- 全0阶码非0尾数:非规格化数
实数与IEEE 754 单精度数的相互转化:


- 定点、浮点表示的区别
- 数字表示范围
- 精度
- 数的运算
- 溢出问题
- 对阶:使两个操作数定点小数点位置对其,即使得两个数的阶码相等。
- 尾数相减:将对阶后的尾数按定点原码小数的加减运算规则进行运算
- 尾数规格化:尾数相加减后可能得到多种结果,如:左规和右规划。
- 舍入:在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将移出的部分低位保留下来,参加中间过程的运算,最后再将运算结果进行舍入,还原表示成IEEE754格式。
- 就近舍入:舍入为最近的可表示数。当运算结果正好在两个可表示数的中间时,选择结果为偶数。
- 正向舍入:朝+∞方向舍入,即取右边最近的可表示数。
- 负向舍入:朝-∞方向舍入
- 截断法:直接阶段所需位数,丢弃后面的所有位。
- 溢出判断
- 右规和尾数舍入。数值很大的尾数舍入时,可能因为末位加1而发生尾数溢出,此时需要通过右规来调整尾数和阶码。右规时阶码加1,导致阶码增大,因此需要判断是否发生了指数上溢。当调整前的阶码为11111110时,加1后,会变成111111而发生指数上溢。
- 左规。左规时阶码减1,导致阶码减小,因此需要判断是否发生了指数下溢。其判断规与指数上溢类似,左规一次,阶码减1,然后判断阶码是否为全0来确定指数是否下溢。由此可见,浮点数的溢出并不是以尾数溢出来判断的,尾数溢出可以通过右规操作得到纠正。
浮点数表示范围远大于定点表示法
在相同字长下,浮点数虽然扩大了数的表示范围,但是精度降低了。
浮点数包括阶码和尾数两部分。运算时不仅要做尾数运算,还要做阶码运算,而且运算结果要规格化。
浮点数运算是阶码运算和尾数运算分开进行,浮点数加减运算分为:
有如下四种舍入模式:
如:1.2400×10²+ 0.0050×10²= 1.2450×10²
若一个正指数超过了最大允许值(127或1023),则发生指数上溢,产生异常。若一个负指数超过了最小允许值(-149或-1074),则发生指数下溢,通常把结果按机器零处理。
C语言中的浮点数类型
C语言中的float型和double型分别对应于IEEE754单精度浮点数和双精度浮点数。longdouble型对应于扩展双精度浮点数,但longdouble型的长度和格式随编译器和处理器类型的不同而有所不同。
- int 转为 float ,不会发生溢出,但是会影响精度
- int 或 float 转 double时,能够保留精确度
- double 转 float ,进行大数转换时可能会发生溢出。
- float 或 double 转 int ,int 无小数位,发生截断进行舍入,可能会溢出。
- Author:Uonlra
- URL:https://www.uonlra.blog//article/1bb54775-fb6a-80b5-bc8d-db27fe6c0a94
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!