第23章定点数和浮点数 日常生活中,有各种各样的数,整数、分数、百分数等等,我们无时无刻不与这些数打 交道。如:用加班275小时获得的1倍半的钱来买半匣鸡蛋需支付825%的销售税。许多人对 诸如此类的数都感到很适应,并不需要怎么在行,即使在听到“平均每个美国家庭有2.6人 这样的统计数字的时候,也不会联想到2.6这个数字对人来说是不是要把人肢解了这样可怕的 问题 在计算机内存里,整数和分数的换算是常见的。存在计算机内存里的东西都是二进制位 的形式,也就是说,都是二进制数。但有些数用位来表示比其他数用位来表示要容易一些 我们使用位来表示数学上称为自然数而计算机编程人员称为正整型数的数,并介绍如何 用2的补码来表示负整数,而这种方法很容易实现正数、负数的加法。下表列出了8位、16位、 32位的正整数及它们的2的补码的范 数的位数 正整数范围 2的补码范围 0~65535 32768~32767 0~4294967295 2147483648~2147483647 要介绍的就是这些。除了整数以外,数学上还定义了有理数,它们可表示成两个整数的 比,这个比也叫分数。例如,3/4是一个有理数,因为它是3与4的比。可以把这个数写成小数 形式0.75,当写成小数时,它真正表示了分数,在此为75/100。 回忆一下第7章里的小数系统,在小数点左边的数字与10的整数次幂相关联;同样,在小 数点右边的数字与10的负整数次幂相关联。第7章用42705684作为例子,该数可以表示成与 下面与之相等的形式 4×10000+ 2×1000+ 7×100+ 0×10+ 5×1 6÷10+ 注意一下除号,可以把这个序列写成没有除号的形式 4×10000+ 2×1000+ 7×100+ 0×10+
下载 第23章 定点数和浮点数 日常生活中,有各种各样的数,整数、分数、百分数等等,我们无时无刻不与这些数打 交道。如:用加班 2 . 7 5小时获得的1倍半的钱来买半匣鸡蛋需支付 8 . 2 5 %的销售税。许多人对 诸如此类的数都感到很适应,并不需要怎么在行,即使在听到“平均每个美国家庭有 2 . 6人” 这样的统计数字的时候,也不会联想到 2 . 6这个数字对人来说是不是要把人肢解了这样可怕的 问题。 在计算机内存里,整数和分数的换算是常见的。存在计算机内存里的东西都是二进制位 的形式,也就是说,都是二进制数。但有些数用位来表示比其他数用位来表示要容易一些。 我们使用位来表示数学上称为自然数而计算机编程人员称为正整型数的数,并介绍如何 用2的补码来表示负整数,而这种方法很容易实现正数、负数的加法。下表列出了 8位、1 6位、 3 2位的正整数及它们的2的补码的范围: 数的位数 正整数范围 2的补码范围 8 0~2 5 5 -1 2 8~1 2 7 1 6 0~65 535 -32 768~32 767 3 2 0~4 294 967 295 -2 147 483 648~2 147 483 647 要介绍的就是这些。除了整数以外,数学上还定义了有理数,它们可表示成两个整数的 比,这个比也叫分数。例如, 3 / 4是一个有理数,因为它是 3与4的比。可以把这个数写成小数 形式0 . 7 5,当写成小数时,它真正表示了分数,在此为 7 5 / 1 0 0。 回忆一下第7章里的小数系统,在小数点左边的数字与 1 0的整数次幂相关联;同样,在小 数点右边的数字与 1 0的负整数次幂相关联。第 7章用42 705.684作为例子,该数可以表示成与 下面与之相等的形式: 4×10 000+ 2×1 0 0 0+ 7×1 0 0+ 0×1 0+ 5×1+ 6÷1 0+ 8÷1 0 0+ 4÷1 0 0 0 注意一下除号,可以把这个序列写成没有除号的形式: 4×10 000+ 2×1 0 0 0+ 7×1 0 0+ 0×1 0+
244编的奥 Chinapub coM 下载 5×1+ 8×0.01+ 4×0.001 最后,可以用10的幂的形式表示如下 4×104+ 2×103+ 0×101+ 5×10°+ 6×10-1+ 有些分数并不容易用小数表示,常见的如13。如果用3去除1,可以得到: 0.3333333333333333333333 而永无止境。我们通常写成简洁形式,在3上面加一道横线来表示无限循环 即使这样,把1/3写成小数也是有些笨拙的。它还是一个分数,因为它是两个整数的比。同样, l/7是 0.142857142857142857 或0.142857 无理数则更不同,如2的平方根。无理数不能表示成两个整数的比,也就是说,小数部分 是无穷的,没有重复规律或固定模式 =141421396237309504890168972420889807896%67187537695 2的平方根是下面这个代数方程的根: x2-2=0 如果一个数不是以整数为系数的代数方程的根,则称为超越数(所有的超越数为无理数 但并不是所有的无理数都是超越数)。超越数包括π,它是圆的周长与直径的比,近似值为 3.1415926535897932846264338327950288419716939937511 另一个超越数是e,它是下面表达式 当n趋近于无穷大时的近似值 2.71828182845904523536028747135266249775724709369996 到现在为止,谈到的所有数一有理数和无理数一—统称为实数。这种定义用来与虚数相 区分。虚数是负数的平方根,复数是由虚数和实数组成的。不管名称如何,虚数揭示了现实 世界的奥秘,可以用来(例如)解决电子学的一些高级问题 习惯上,我们把数看成是连续的。如果给出两个有理数,则可以找出一个数在这两个数 中间。实际上,只需取平均值即可。但是,数字计算机不能处理连续事件。位不是0就是1
5×1+ 6×0 . 1+ 8×0 . 0 1+ 4×0 . 0 0 1 最后,可以用1 0的幂的形式表示如下: 4×1 04+ 2×1 03+ 7×1 02+ 0×1 01+ 5×1 00+ 6×1 0-1+ 8×1 0-2+ 4×1 0-3 有些分数并不容易用小数表示,常见的如 1 / 3。如果用3 去除1,可以得到: 0.3333333333333333333333...... 而永无止境。我们通常写成简洁形式,在 3 上面加一道横线来表示无限循环: 0 .-3 即使这样,把1 / 3写成小数也是有些笨拙的。它还是一个分数,因为它是两个整数的比。同样, 1 / 7是: 0.142857142857142857...... 或0.142857 无理数则更不同,如 2的平方根。无理数不能表示成两个整数的比,也就是说,小数部分 是无穷的,没有重复规律或固定模式: 2的平方根是下面这个代数方程的根: x 2 - 2 = 0 如果一个数不是以整数为系数的代数方程的根,则称为超越数(所有的超越数为无理数, 但并不是所有的无理数都是超越数)。超越数包括p,它是圆的周长与直径的比,近似值为: 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0 2 8 8 4 1 9 7 1 6 9 3 9 9 3 7 5 1 1 . . . . . . 另一个超越数是е,它是下面表达式: 当n趋近于无穷大时的近似值: 2.71828182845904523536028747135266249775724709369996... 到现在为止,谈到的所有数—有理数和无理数—统称为实数。这种定义用来与虚数相 区分。虚数是负数的平方根,复数是由虚数和实数组成的。不管名称如何,虚数揭示了现实 世界的奥秘,可以用来(例如)解决电子学的一些高级问题。 习惯上,我们把数看成是连续的。如果给出两个有理数,则可以找出一个数在这两个数 中间。实际上,只需取平均值即可。但是,数字计算机不能处理连续事件。位不是 0就是1, 244 编码的奥秘 下载 1+ 1 n æ è ç ö ø ÷ n
第3章定点数和浮点数245 下载 没有中间值。由于这一特性,数字计算机必须处理离散值。可以表示的离散值的个数直接与 可达到的二进制位数相关。例如:如果用32位来存放正整数,则可以存放0~4294967295个 整数。如果需要存放45这个数,则必须重新考虑一种方法并做一些改动。 小数可以表示成二进制吗?是的,可以。最容易的方法可能是二进制编码的十进制 (BCD)。前面第19章讲到BCD是十进制数的二进制编码,每一个十进制数字(0、1、2、3 4、5、6、7、8和9)需要4位,如下表所示: 十进制数字 进制数字 0000 0010 0110 0l11 BCD码特别适用于用美元和美分表示的与钱数有关的计算机程序。银行和保险公司是两 个典型的多与钱打交道的行业,对这类公司的计算机程序来说,许多分数只需要两个十进制 数位 通常1个字节存储两个BCD数字,有时将这称为压缩BCD码。2的补码不与BCD一起使用 因此,压缩BCD码通常要有额外的一位(称作符号位)来标明是正数还是负数。一个BCD数存 入整个字节比较方便,所以,小小的符号位通常需要牺牲4位或8位的存储空间。 来看一个例子。假定计算机要处理的钱数不会超过正、负1000万,换句话说,需要表示 的钱数的范围从一999999999~999999999,则存储在内存的每一笔钱数需要用5个字节来 表示。例如,-4325120.35用5个字节表示为 0001010000110010010100010010000000100101 或用十六进制表示为 14h32h5lh20h25h 注意最左边的1用来表示负数,即符号位。如果是正数,则该位为0。每一个数字需要4位, 从十六进制值中可以直接看到。 如果需要表示的数的范围从一9999999999~9999999999,则需要6个字节—10个数 字占5个字节,另一个字节仅用来表示符号位 这类存储和标记方法也称作定点格式,因为小数点通常固定在特定的位置一本例中,小 数点在两个小数位之前。注意,实际上并没有什么东西与数一起存放用来标明小数点的位置。 处理定点格式数的程序应该知道小数点在哪里。定点数可以有任意个小数位数,在同一计算 机程序里可以混用这些数字,但是对这些数进行算术运算的那部分程序必须知道小数点的位 定点格式只在知道这些数不会超过预先确定的内存单元,且没有太多小数位的场合比较适 用。在数可能很大或可能很小的场合定点格式完全不适用。假设保留一个内存区域用来存储以 英尺为单位的距离,则存在的问题是距离可能超出范围。从地球到太阳的距离是49000000000
第23章 定点数和浮点数 245 下载 没有中间值。由于这一特性,数字计算机必须处理离散值。可以表示的离散值的个数直接与 可达到的二进制位数相关。例如:如果用 3 2位来存放正整数,则可以存放 0~4 294 967 295个 整数。如果需要存放4 . 5这个数,则必须重新考虑一种方法并做一些改动。 小数可以表示成二进制吗?是的,可以。最容易的方法可能是二进制编码的十进制 (B C D)。前面第1 9章讲到B C D是十进制数的二进制编码,每一个十进制数字( 0、1、2、3、 4、5、6、7、8和9)需要4位,如下表所示: 十进制数字 二进制数字 0 0 0 0 0 1 0 0 0 1 2 0 0 1 0 3 0 0 11 4 0 1 0 0 5 0 1 0 1 6 0 11 0 7 0 111 8 1 0 0 0 9 1 0 0 1 B C D码特别适用于用美元和美分表示的与钱数有关的计算机程序。银行和保险公司是两 个典型的多与钱打交道的行业,对这类公司的计算机程序来说,许多分数只需要两个十进制 数位。 通常1个字节存储两个B C D数字,有时将这称为压缩B C D码。2的补码不与B C D一起使用, 因此,压缩 B C D码通常要有额外的一位 (称作符号位)来标明是正数还是负数。一个 B C D数存 入整个字节比较方便,所以,小小的符号位通常需要牺牲 4位或8位的存储空间。 来看一个例子。假定计算机要处理的钱数不会超过正、负 1 0 0 0万,换句话说,需要表示 的钱数的范围从-9 999 999.99~9 999 999.99,则存储在内存的每一笔钱数需要用 5个字节来 表示。例如,-4 325 120.35用5个字节表示为: 00010100 00110010 01010001 00100000 00100101 或用十六进制表示为: 14h 32h 51h 20h 25h 注意最左边的1用来表示负数,即符号位。如果是正数,则该位为 0。每一个数字需要4位, 从十六进制值中可以直接看到。 如果需要表示的数的范围从- 99 999 999.99~99 999 999.99,则需要6个字节—1 0个数 字占5个字节,另一个字节仅用来表示符号位。 这类存储和标记方法也称作定点格式,因为小数点通常固定在特定的位置—本例中,小 数点在两个小数位之前。注意,实际上并没有什么东西与数一起存放用来标明小数点的位置。 处理定点格式数的程序应该知道小数点在哪里。定点数可以有任意个小数位数,在同一计算 机程序里可以混用这些数字,但是对这些数进行算术运算的那部分程序必须知道小数点的位 置。 定点格式只在知道这些数不会超过预先确定的内存单元,且没有太多小数位的场合比较适 用。在数可能很大或可能很小的场合定点格式完全不适用。假设保留一个内存区域用来存储以 英尺为单位的距离,则存在的问题是距离可能超出范围。从地球到太阳的距离是490 000 0 0 0 0 0 0
246编的肉 Chinapub.com 下载 英尺,氢原子的半径为0000000006英尺,则你需要12字节的定点存储空间来容纳这些可能 很大也可能很小的数值。 如果你还记得科学家和工程师们喜欢用称为“科学记数法”的系统来表示数的话,你也 许已找到更好的存储此类数的方法。科学记数法特别适用于表示很大和很小的数,因为它采 用10的幂方法从而不用写很长的一串0。采用科学记数法后,数字 490000000000写成49×10 0.0000000006写成26×10-0 在这两个例子里,数字49和26称作小数部分或首数,有时也称作有效数(尽管这个词更 适用于对数运算)。为了与计算机术语相协调,在这儿把科学记数法的这一部分称作有效数 指数部分是10的幂。在第一个例子中,指数是11:在第二个例子中,指数是一10。指数 用来指明有效数的小数点要移动的位数。 为方便起见,有效数通常大于或等于1而小于10。尽管下面的数字是相等的: 4.9×10=49×1010=490×10°=0.49×102=0.049×1013 但我们选用第一种格式。这种格式也称作科学记数法的规格化格式。 注意,指数符号只是标明数的大小而并不表示数本身是正的还是负的。下面是用科学记 数法表示的两个负数的例子 5.8125×107等于-58125000 和 58125×10-7等于-0.00000058125 在计算机中,对应于定点表示法的是浮点表示法。浮点格式用来存储较小或较大的数比 较理想,因为它是以科学记数法为基础的。但是,计算机中采用的浮点格式是用科学记数法 表示的二进制数。这里首先要提到的是如何用二进制表示小数数字 实际上,这比设想的要容易,在十进制表示中,小数点右边的数字具有10的负整数次 幂:在二进制表示中,二进制小数点(也仅是一个点,看起来与十进制小数点一样)右边的 数具有2的负整数次幂。例如,一个二制数: 10l.1101 可以用以下表达式转换成十进制 1×4+ 0×2+ 1×1+ 0÷8+ 1÷16 除号可以用2的负整数次幂替换:
246 编码的奥秘 下载 英尺,氢原子的半径为 0 . 0 0 0 0 0 0 0 0 0 2 6英尺,则你需要1 2字节的定点存储空间来容纳这些可能 很大也可能很小的数值。 如果你还记得科学家和工程师们喜欢用称为“科学记数法”的系统来表示数的话,你也 许已找到更好的存储此类数的方法。科学记数法特别适用于表示很大和很小的数,因为它采 用1 0的幂方法从而不用写很长的一串 0。采用科学记数法后,数字 490 000 000 000 写成 4 . 9×1 011 数字 0.00000000026 写成2 . 6×1 0-1 0 在这两个例子里,数字 4 . 9和2 . 6称作小数部分或首数,有时也称作有效数(尽管这个词更 适用于对数运算)。为了与计算机术语相协调,在这儿把科学记数法的这一部分称作有效数。 指数部分是1 0的幂。在第一个例子中,指数是 11;在第二个例子中,指数是- 1 0。指数 用来指明有效数的小数点要移动的位数。 为方便起见,有效数通常大于或等于 1而小于1 0。尽管下面的数字是相等的: 4 . 9×1 011=4 9×1 01 0=4 9 0×1 09=0 . 4 9×1 01 2=0 . 0 4 9×1 01 3 但我们选用第一种格式。这种格式也称作科学记数法的规格化格式。 注意,指数符号只是标明数的大小而并不表示数本身是正的还是负的。下面是用科学记 数法表示的两个负数的例子: -5 . 8 1 2 5×1 07 等于-58 125 000 和 -5 . 8 1 2 5×1 0-7 等于-0 . 0 0 0 0 0 0 5 8 1 2 5 在计算机中,对应于定点表示法的是浮点表示法。浮点格式用来存储较小或较大的数比 较理想,因为它是以科学记数法为基础的。但是,计算机中采用的浮点格式是用科学记数法 表示的二进制数。这里首先要提到的是如何用二进制表示小数数字。 实际上,这比设想的要容易,在十进制表示中,小数点右边的数字具有 1 0的负整数次 幂;在二进制表示中,二进制小数点(也仅是一个点,看起来与十进制小数点一样)右边的 数具有2 的负整数次幂。例如,一个二制数: 1 0 1 . 11 0 1 可以用以下表达式转换成十进制: 1×4+ 0×2+ 1×1+ 1÷2+ 1÷4+ 0÷8+ 1÷1 6 除号可以用2 的负整数次幂替换:
第23章定点数和浮点数 247 下载 或者,2的负整数次幂可以从1开始重复除以2来计算 0×2+ 1×0.5+ 1×0.25+ 0×0.125+ 1×0.0625 通过这些计算得到101.1101等效的十进制数5.8125。 在十进制科学记数法中,规格化有效数通常大于或等于1而小于10。同样,二进制科学记 数法的规格化有效数也通常大于或等于1而小于10(即十进制中的2)。所以,按二进制科学记 数法,数 101.1101表示成1011101×2 这个规则隐含了一件有趣的事实:通常二进制浮点数在二进制小数点的左边除了1以外再 没有别的了 现代计算机和计算机程序按照IEEE在1985年制定的标准来处理浮点数,这个标准也为 ANSI( the American national standards institute,美国国家标准局)所认可。ANSI/IEEE Std754-1985称作IEEE二进制浮点数算术运算标准。它并不像一般标准那样长,只有18页 但却奠定了以方便的方式编码二进制浮点数的基础 IEEE浮点数标准定义了两个基本格式:单精度格式,需要4个字节:双精度格式,需要8 个字节 首先看一下单精度格式,它有三部分:1位个符号位(0表示正,1表示负)、8位的指数位 和23位的有效数位。如下所示,最低有效数在最右边: s=1位符号 e=8位指数 f=23位有效数 总共有32位,4个字节。因为规格化二进制浮点数的有效数通常在二进制小数点左边为1, 所以在IEEE格式中这一位不包含在浮点数的存储空间中。有效数的23位小数部分是反被存储 的部分,所以,即使只有23位用来存储有效数,精度仍然认为是24位的。过一会儿将要看到 24位精度的意义 8位指数范围从0~255,称为移码指数,意思是必须从指数中减去一个数(称为偏移量) 才能确定有符号指数的实际值。对单精度浮点数,偏移量为127
1×2 2+ 0×2 1+ 1×2 0+ 1×2 -1+ 1×2 -2+ 0×2 -3+ 1×2 -4 或者,2的负整数次幂可以从1开始重复除以2来计算: 1×4+ 0×2+ 1×1+ 1×0 . 5+ 1×0 . 2 5+ 0×0 . 1 2 5+ 1×0 . 0 6 2 5 通过这些计算得到1 0 1 . 11 0 1等效的十进制数5 . 8 1 2 5。 在十进制科学记数法中,规格化有效数通常大于或等于 1而小于1 0。同样,二进制科学记 数法的规格化有效数也通常大于或等于 1而小于1 0(即十进制中的2)。所以,按二进制科学记 数法,数 1 0 1 . 1101 表示成 1 . 0 111 0 1×2 2 这个规则隐含了一件有趣的事实:通常二进制浮点数在二进制小数点的左边除了 1以外再 没有别的了。 现代计算机和计算机程序按照 I E E E在1 9 8 5年制定的标准来处理浮点数,这个标准也为 ANSI(the American national standards institute,美国国家标准局 )所认可。 A N S I / I E E E S t d7 5 4-1 9 8 5称作I E E E二进制浮点数算术运算标准。它并不像一般标准那样长,只有 1 8页, 但却奠定了以方便的方式编码二进制浮点数的基础。 I E E E浮点数标准定义了两个基本格式:单精度格式,需要 4个字节;双精度格式,需要 8 个字节。 首先看一下单精度格式,它有三部分: 1位个符号位(0表示正,1表示负)、8位的指数位 和2 3位的有效数位。如下所示,最低有效数在最右边: 总共有3 2位,4个字节。因为规格化二进制浮点数的有效数通常在二进制小数点左边为 1, 所以在I E E E格式中这一位不包含在浮点数的存储空间中。有效数的 2 3位小数部分是反被存储 的部分,所以,即使只有 2 3位用来存储有效数,精度仍然认为是 2 4位的。过一会儿将要看到 2 4位精度的意义。 8位指数范围从 0~2 5 5,称为移码指数,意思是必须从指数中减去一个数(称为偏移量) 才能确定有符号指数的实际值。对单精度浮点数,偏移量为 127 。 第23章 定点数和浮点数 247 下载 s=1位符号 e=8位指数 f=23位有效数