Sharpmark's Personal Home Page

浮点表示法

“为了表示实数,大多数浮点格式使用一些位来表示尾数(mantissa),一小部分位来表示阶码(exponent,又译作指数)。尾数是一个基数,它的值通常落在一个有限的范围内(例如,零到一),而阶码是一个乘数,他作用到位数值后,产生的值就超出了这个范围。将浮点数分成这两部分结果就是,浮点 数只能以一定数量的有效数字(significant digit)来表示数值。”

“为了提高浮点计算的准确性,有必要在计算过程中使用额外的有效数字。这些额外的有效数字被称为保护位(guard digits,二进制格式时为guard bits)。在进行一长串的运算时,保护为极大地提高了准确性。”

有关有限精度计算的几个重要规则
“计算的顺序可以影响结果的准确性。将运算分组,其原则是先对数量级接近的数进行相加或者相减,再对数量级相差较大的数进行运算。
在对符号相同的两个数做减法或者符号不同的两个数做加法时,结果的精度可能比所用的浮点格式所能支持的精度要小。
在进行一系列涉及到加法、减法、乘法与处罚的计算时,尽量先作乘法与除法。
在对一组数作乘法或除法时,尽量对数量级相对一样的数作乘法与除法。
在比较两个浮点数是否相等时,要做的是计算这两个数的差,看它是否小于某个很小的误差值。例如if( (value1 - value2) // then …

IEEE浮点数格式
IEEE有三种浮点数格式:单精度(single precision),双精度(double precision),以及扩展精度(extended precision)。这里举单精度为例。
“单精度浮点格式使用24位的尾数与8位的阶码。尾数通常表示的值在大于等于1.0到小于2.0之间。尾数的最高位总是假定为一,正好是在二进制小数点左边的第一个位,而余下的23个尾数位则在小数点的右边。”
“尾数使用一的补码格式而不是二的补码。这意味着尾数的24位值通常是一个无符号数,而位于第31位的符号为决定了正负。”而第23~30位表示阶码,0~22表示尾数。(其中有23个尾数的位,而最高位是1,所以有了24位。)
“为了表示1.0到小于2.0范围之外的数,就需要阶码了。浮点格式将计算二的有阶码的值指定的幂,并将尾数乘以这个数。阶码是八位的,它使用余- 127格式(excess-127),有时候也成为移-127(bias-127)阶码。使用余-127格式,阶码2^0表示为127(0×7F)。因 此,为了将一个阶码转换为余-127格式,只需要加上127就可以了。阶码使用余-127格式简化了浮点数的比较。因为如果我们将符号位(第31位)单独 处理,那么对两个浮点数作小于或者大于的比较就很容易了,只需要将它们看作是无符号整型数作比较就可以了。”
“将尾数左移一位同时递减阶码就不会改变浮点数的值。”反之亦然。

规格化(normalization)与反向规格化(denormalized)数
“规格化浮点数就是尾数最高位是一的浮点数。”
“在两种重要的情况下,浮点数是无法被规格化的,零就是特例之一。浮点格式支持+0也支持-0(取决于符号位的值)。Intel推荐使用符号位来表示该零值是负数下溢产生的(符号位置一)还是正数下溢产生的(符号位清零)。”
“无法规格化浮点数的第二种情况是尾数的高端几个尾是零,但是移位阶码(移位意味着给数值加上偏移量,如余-127格式的移位是127)也是零。IEEE允许使用特殊的反向规格化数来表示它们。”

舍入(rounding)
舍位(truncation):直接舍弃额外的精度。
上舍入(rounding up):将结果置为目标浮点格式中大于当前之中所有数的最小值。对应函数ceil。
下舍入(rounding donw):将结果置为目标浮点格式中小于当前之中所有数的最大值。对应函数floor“舍位与下舍入之间存在着微妙的差别。舍位总是是的结果更接近零。 对于正数来说,设位于下舍入的结果是一样的。但是,对于负数,舍位只是简单地使用尾数中现有的位,而下舍入会给最低位加上一。”
四舍五入 (rounding to nearest):“如果保护位的值小于尾数最低位的值的一半,那么四舍五入方式会将结果舍入到小值中的最大值(忽略符号位)。如果保护位的值小于尾数最 低位的值的一半,那么四舍五入方式会将结果舍入到大值中的最小值(忽略符号位)。如果保护位的值正好等于尾数最低位的值的一半,IEEE浮点标准的说法是 上舍入和下舍入各半。具体实现可以是将尾数舍入到最低位等于零。也就是说,如果当前的尾数的最低位已经是零,就直接使用该尾数值,如果当前的尾数值最低位 等于一,就将尾数加一。”

特殊的浮点数
“如果阶码全一儿尾数非零(不管隐含位),那么尾数的最高位(仍然不包括隐含位)用来表示这个数是一个未明无效数字(quiet not-a-number, QNaN)或者明确无效数字(signaling not-a-number, SNaN),这些无效数字(not-a-number, NaN)结果告诉系统计算过程中出现了严重的错误,计算的结果是完全不确定的。未明无效数字代表不确定的结果,而明确无效数字则代表确定发生了无效的操 作。任何运算中,只要存在无效数字,结果就是无效数字。”
“另两种特殊的浮点数表示是阶码全一,而且尾数全零。这种情况下,符号位表示该书是正无穷大(+infinity)或者是负无穷大。”

留下 您的足印

请注意评论的语气。不要谈论违法,影响社会"河蟹"的言论。您的email永远不会被公开。