科学网

 找回密码
  注册

tag 标签: 限位数

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

P与NP问题为什么会成为百万美元大奖的世界难题?
accsys 2017-8-22 07:22
P 与 NP 问题为什么会成为百万美元大奖的世界难题? 姜咏江 P 与 NP 问题是美国克雷数学所悬赏百万美元大奖的七大世界难题之一。简单地说,用计算机在多项式时间内求出解的一类问题,称为 P 类问题;而在多项式时间可以验证是否是解的问题,称为 NP 类问题。回答 P 与 NP 是同一类问题吗?这就是 P 与 NP 问题。 这个看似简单的问题,为何会成为公开的世界难题?我认为原因是人们行进到了不易解决的方向上所致。这首先是一个不连续的数学问题,想用连续数的理论去解决,自然是徒劳的事情。 一、一些基本概念的理解 我们先说清楚几个概念。 可判定问题:能够知道对与错的问题。 显然, P 与 NP 类问题都是可判定问题。又 P 类问题求解过程就能验证对与错,因而 P 类问题就是 NP 类问题。 2. 多项式: k 是一个常数, a 1 x+a 2 x 2 +...+a n x k 叫多项式。 如果将 k 理解成一个随着变量数 n 而变化的量,那就不准确理解 P 与 NP 问题中所说的多项式含义了。因为由二项式定理可知: (1+1) n =( n 0 )+( n 1 )+...+( n k )+...+( n n ) ,等式左面是 2 n ,是一个关于 n 的指数函数。右面虽然写成了多个项,但已不是 P 与 NP 问题中多项式的概念,其中 k 项之后不能算数。 计算机程序执行快慢:同一计算机对同一问题不同设计程序执行快慢的发展趋势。 例如一个程序对某问题能够求出解的时间是 T=2 n ,另一程序对同一问题的求解时间是 T=n 4 ,此时不能笼统地说哪个程序快。因为从 2 n =n 4 可知,若二进制 n=2 k ,就有 2 k =4k 得 k=4 。即当 n 大于 16 时,才有 2 n n 4 。 T=n 4 这个程序才会比 T=2 n 程序快。所以 P 与 NP 问题要研究影响程序执行快慢因素 n 变大的过程,什么样的程序执行快。知道了这些,就会明白程序执行如果是多项式时间的就会快。 问题通俗解释是,对 n 个逻辑变量验证可能结果对错,最坏情况是 T=2 n (穷举法),也就是说能够用穷举法找到答案的问题( NP )能否在多项式时间得到答案。 二、 最看似简单的 SAT 问题 有 n 个逻辑变量,下面公式( 1 )用“ + ”表示或运算符,用“ ’ ”表示非运算符,将与运算符省略了。 SAT = ( x 1 ’+ x 2 ’+ x 3 ’)( x 1 ’+ x 2 + x 3 ’)( x 1 + x 2 ’+ x 3 )( x 1 + x 2 + x 3 ’)( x 1 ’+ x 3 + x 4 ’)( x 1 ’+ x 3 + x 4 )( x 3 ’+ x 4 ’+ x 6 + x 9 ’)( x 3 + x 5 ’+ x 6 ’)( x 3 ’+ x 5 ’+ x 6 + x 10 )( x 3 + x 5 + x 6 + x 10 )( x 6 + x 7 + x 8 ’)( x 6 + x 7 ’+ x 8 )( x 6 ’+ x 7 + x 8 ’)( x 8 ’+ x 9 )( x 8 + x 9 )( x 10 ’) (1) 公式( 1 )的逻辑运算式叫合取范式。 合取范式能不能有一组变量值是其结果是 1 (“真”),这就是 SAT 问题。 显然,我们可以将 2 n 个不同的 n 位二进制数带入( 1 )右端检验结果,一定可以找到答案,这是穷举法,是 2 n 指数时间的算法。 SAT 问题有没有多项式时间的算法?以往,人们没有找到,因而才成了典型的寻找 NP 是否是 P 问题的实例。人们已经证明了,如果 SAT 问题有多项式时间算法,那么 NP 类问题就是 P 类问题。 三、 元素关联是纯离散问题 实际当中许多问题是不能够用连续的实数来描述的。这些问题中常常是只需要回答元素的有与无。各种事物的组成分析都属于这种元素存在问题。有些问题在元素存在分析的基础上,又会加入某种特性的描述,在这种特性之下来求极值。例如,邮差问题、子集和问题等,必须先解决元素存在,在存在的基础上需求最优解。这些问题难就难在解决相关元素关联存在的问题上。 NP 类问题首先是纯离散的问题。这类问题中的基础是先找出事物的存在,然后才是寻求属性的极值。而以往,人们追求用连续数学描述,脱离了问题的首要实际。例如,采用概率形式的算法并不能求出精确值,而 NP 问题要求结果是精确值。 四、 纯离散问题需要结构分析 纯离散问题有两大特点。第一,元素数量有限。第二,元素间总有一定的存在结构。元素存在的结构形成事物。事物就是某种条件下的元素子集。某种子集有没有,找到它常常是问题的难点。例如, SAT 问题、哈密顿回路问题、顶点覆盖问题、团问题、子集和问题、邮差问题等。 要做结构分析,数据抽象是关键。其中最好的莫过于用 0 和 1 来表示元素的存在与不存在。这样就可以将这些存在分析问题,转化成二进制数的有限位分析,从看似无结构的状态中,显现出离散元素构成事物的内在结构。对这些由 0 和 1 描述表现出来的规律,再做进一步的分析,就容易达到光辉的顶点。对 P 与 NP 问题的解决,这一定是一条可行之路。 请参阅: http://blog.sciencenet.cn/blog-340399-1070984.html 2017-8-22
个人分类: P/NP问题|3488 次阅读|0 个评论
计算机时代的数学家应该有新思维了
热度 2 accsys 2017-6-4 05:51
计算机时代的数学家应该有新思维了 姜咏江 我在 2016 年提出的“专家排序法”( http://blog.sciencenet.cn/blog-340399-995138.html http://blog.sciencenet.cn/blog-340399-993790.html ) 居然没有得到国内数学家们的重视。很奇怪,在计算机时代,或者说在用计算机进行计算的时代,数学家们不研究一下限位数的理论和方法,恐怕要落伍了。 按照非机器计算的思维方式,一般对 n 个数进行排序去重,要访问 n !次。姜咏江提出的专家排序法,只要进行 n 次数据迁移就可以达到目的。这不是一种快速的排序去重方法吗?为了研究 SAT 问题的子句消去法的多项式时间复杂度,姜咏江才研究了限位数在计算机中的排序去重问题。这才有了专家排序法。 子句消去法在进行子句消去过程中,会出现 k 个变量组成的子句重复。例如从 3 个变量的子句,由于消去了一个变量就变成了 2 个变量的子句,加上原有的 2 个变量的子句就可能出现重复。 n 个变量的 3 阶子句中与某个 2 阶子句块相同的子句最多只有一个变量不同,所以子句最多有 n(n-1) 个,而 2 阶子句块的子句最多只有 4 个,我们总需要一一进行比较吗?显然傻子才会这样做!因为这时只要判断那些数中 00 , 01 , 10 , 11 就可以了。当这 4 个数都出现之后,就不用再操作了。如果最后都未全部出现,也不会超过比较 n(n-1) 这个二次多形式时间而已,为了去掉重复,而不用是 n !次。这就是限位数排序的原理。 计算机中的数是限制在固定位数作为处理单位的。一般的数据类型是计算机处理器或存储器存储单元位长的倍数。因而用限位数排序,即姜咏江提出的专家排序法就是这个原理的运用。 在证明子句消去法是一个多形式时间算法中,我运用了专家排序法。据说证明 SAT 问题是多项式时间复杂度算法,必须有数学家们的认可。故写出此博文加以提醒。计算机普及时代的数学家,研究限位数的理论和方法,抛弃连续性,研究纯离散的数字表示,这是广泛存在的计算理论,也是当务之急。 文中所用言辞及写入自己的名字,是为防网络界不当操作行为而为之,望读者见谅。 哎,做创新的学问真难! 2017-6-4
个人分类: 相关计算|4135 次阅读|6 个评论
限位数——一个人们不曾研究的领域
accsys 2016-12-19 09:03
姜咏江 什么是限位数?就是数码位数一定的数。以往人们并没有注意对限位数的研究,是因为人们极少用到它。现在人们用电脑了,用电脑要解决问题,在设计上就不得不考虑位数一定的数,而且要考虑怎样用位数一定的数来表达实数。当然这个问题首先是计算机设计专家碰到的问题。在计算机中只有不带符号的二进制整数,而且是限定了位数的 32 位、 64 位或 128 位等。人们不可能造出位数无限长的计算机,因而用限位数来表示和运算来解决实数的运算问题,是首先要解决的问题。实际上这个问题已经基本上解决了。解决最彻底是我在十多年前完成的限位数理论和方法,在计算机算术运算器的设计中有着根本性的作用。不管人们是否认可,它就放在那里。 这两年多,我研究 SAT 问题多项式时间复杂度算法,对限位数的使用又有了新的发现。如果把过去研究限位数看作只是一维的研究方法,那么针对 SAT 问题,已经进入了二维空间的研究。毫无疑问,这种研究为破解难题 SAT 问题,找到了坚实的理论基础,为那些需要整体结构分析才能够解决的难题,打开了一扇大门。 关于限位数在数值计算当中的基本原理,我在《自己设计制作 CPU 与单片机》一书中已经介绍。对于限位数二维空间的特点,本文就做一点简单的介绍,目的是让人们能够理解 SAT 问题如何利用子句消去法完成计算求解。 为了简单,仅就二进制限位数的一些基本性质述说。 k 位二进制数最多有 2 k 个,叫全块。 k 位二进制数全体,每位 0 和 1 都有 2 k-1 个。 将数码 0 和 1 互换得到的数叫反码数。每一个限位数都有唯一反码数。 反码数之间每位数码都不同,非反码数之间至少有一位数码相同。 限位数在子句消去法中的应用: SAT 问题可以用 0 和 1 表示成一张表。表中的每一行就是一个限位数,叫子句。 x 1 x 2 x 3 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 如果我们将变量的值设定为 0 ,那么这一列每个为 0 的子句的值就是 1 。按照逻辑运算的法则,就不影响对其余子句是否值为 1 的判断,因而可以消去。上表是全块,不论如何设定变量的值,都不可能让全部子句值为 1 ,一定会有子句剩下。显然,不是全块,就可能设定变量值将全部子句消去。 只要非全块中有一个变量有2 k-1 个0或1,那么这个变量就有唯一解。 用这种全局结构的判断就可以逐步地求出 SAT 的解,而无需考虑多次猜测性的重来。 当变量同时在不同的子句块中出现时,要比单一子句块复杂,但用上面限位数的性质,就可以找到那些只有唯一值的变量,通过这些变量的值确定,最终可达到求出 SAT 的解。当然,如果 SAT 本身就无解,子句消去法在求解的过程中,可发现无解的全块和有唯一解的矛盾的情况。 二维的限位数值得我们深入地进行研究。目前在解决 SAT 问题满足解中只是露出了头角而已。 2016-12-19
个人分类: 离散数学|2366 次阅读|1 个评论
限位数揭开了机器数值运算的全部秘密
accsys 2016-12-7 03:39
人们时常不能理解,为什么机器能够替代人做算术运算?一般的回答是,因为机器可以表示二进制数。小数点和正负号机器也能表示吗?回答是不能直接表示,可以隐含小数点,通过限位数大小来判断正负数。数值运算机器只做加法,其它的数值运算都是通过加法实现的。超长的数用限位数能够分段计算。 本人近期又发现限位数可以实现事物因素分析的算计,可直接用到数字电路化简,基因计算,复杂组成分析,决策博弈等。限位数用到这些非数值运算型的问题的算计当中,可以保证在实际操作之前就能够确定成功与失败。 二进制限位数的特点,为非数值计算由计算机实现提供了基本方法。
个人分类: 教学点滴|2107 次阅读|0 个评论
限位数用于运算器设计原理知多少(续)
accsys 2016-4-4 07:56
7. 算术运算的软硬件划分 要使限位数加减法运算器能够完成超长数的运算,最好的办法就是按照限位数的固定位数分段进行。计算机的减法运算是通过加法来完成的。依据对称制的性质( 5 ),只要设法将减数换成它的对称码,就可以用加法运算获得减法的结果。 例如, 031-456=031+544=575 上面的过程可以用计算机的硬件状态变化完成。凡是有减法运算存在,就不能够将运算结果理解成无符号数,因而 575 是负数 -425 。这是对数字信息的理解问题,因而属于软件的任务。当然,我们可以将计算机实际表达的数都理解成有符号数,在这种理解之下,我们就可以设计出有限位数的加减法运算器,使之能够进行超长位数的数值计算。这种设计结构如 图 1 所示。 图 1 16 位加减法运算器结构 上面这个 16 位的加减法运算器结合存储器,可以完成对任何有限长度的有效位数值计算。其基本计算方式是按照 16 位将 2 个参加运算的数进行分段。计算时由低到高将分好的段送入前端寄存器 a 和 b ,通过 jjfq 的逻辑电路得到结果,并将将分段运算的结果有序保存起来,最终得到超长的运算结果。 定长加减法运算器 jjfq 具有带进位和不带进位的运算功能,因而可以将低段运算产生的进位送到高段参加运算,使整个运算过程获得精确的结果。想了解这方面详细情况,可阅读《计算机原理教程》或《自己设计制作 CPU 与单片机》等书籍。 机器表达的数本身没有正负号。例如 11111111 ,按有符号数理解成 -1 ,按无符号数理解成 255 都可以。在一组数值的算术运算中,一般应理解成有符号数,因为运算的中间或最终的结果可能是负值。再次提醒讲授计算机课程的教师们,不要再人云亦云地说什么“最高位是符号位”这种懵懂的说词吧。 8. 从运算器上改造计算机 国外的计算机运算器的设计原来是从不够完善的“补码制”理论衍生出来的,这种所谓的补码制会出现边界值二义性,因而造成为了精确而不断扩充运算器位数。现在他们的设计是否已经有所改变了,我们不知道。我们要在计算机核心设计上有所建术,就必须自己去设计运算器,设计 CPU ,设计自己的指令系统。这不仅是一个安全可靠问题,而且也是一个计算机科学的先进与落后问题。 事到如今,如果还没有自己设计过计算机的 CPU 和指令系统,恐怕应无颜自称为“计算机专家”吧?也许我们叫一个软件设计专家尚可。不然,也许还会出现 TMJS 那样的乌龙事件,叫人汗颜。 2016-04-04
个人分类: 机器计算|3462 次阅读|0 个评论
限位数用于运算器设计原理知多少
热度 1 accsys 2016-3-28 20:43
限位数用于运算器设计原理知多少 姜咏江 用限位数理论和方法来设计计算机的运算器,就可以让计算机进行丝毫不差的算术运算,即使 CPU 只有 8 位的运算器,也不会让超大数值的计算产生丝毫的误差。这对货币发行与计数的银行业来说,其重要性可想而知,更不要说那些利用机器进行精确计算的行业了。本人发现限位数对 SAT 问题的快速求解也奠定了基础。 1. 什么是限位数? 所谓的限位数,就是 限定记数位数,用数码排列得到的数 。所谓 N 进制数是用从 0 开始的 N 个数码按照“逢 N 进一”的规则书写的数。本文仅就基数 N 是偶数的限位数进行相关讨论,文中使用的 N 与 k 一律是正整数。 我们知道 N 进制的数码共有 N 个,它们是 0 、 1 、 … 、 @ ( @=N-1 )。如果 N 进制数有 k 个位置,每个位置可以放 N 个数码,依据乘法原理,共有 N k 个 k 位数。在限位数理论中称 k 位 N 进制数的个数 N k 为限数。因为限数限制了限位数的总数。 设 N 进制的数码是 0 、 1 、 … 、 @ ( @=N-1 ) , 那么显然 k 位 N 进制最大数是由最大数码组成的数。 例如, 5 位十进制的最大数码 @=9 ,最大数 是 99999 。而 3 位十六进制的最大数码是 F ,那么最大数是 FFF 。 在限位数理论中,如果两个数码的和是最大数码,一个叫另一个的反码;将一个限位数的数码都用其反码替换,得到的数叫原数的反码数。 例如,十进制的反码有 5 对:( 0,9 ) (1,8)(2,7) (3,6) (4,5) 。二进制的反码只有一对:( 0 , 1 )。 2. 限位数的特性 为了表明限位数的位数,限位数的每个位置都必须书写数码。根据我们已有的知识,很容易理解限位数的如下特性: ( 1 )限数比最大限位数大 1 。 ( 2 )反码数唯一,且和为最大数。 ( 3 )限位数加法运算最高进位自动丢失。 ( 4 )限位数都是非负整数。 3. 用限位数表示实数 我们一般知道的实数要用正负号和小数点来辅助表示。用机器来进行算术运算,加入正负号和小数点是愚昧的行为。那么用限位数如何表示实数?我们以大家熟悉的十进制来加以说明。 ( 1 )对称制 例如, 3 位的十进制数有 000 ~ 999 这 1000 个。如果我们仍然用 000 表示 0 ,那么可以按着大小从 500 处等分剩余的那些数,即分为 001 ~ 499 和 501 ~ 999 这两个数量相等的部分。我们还会发现 和 这两部分在数轴上是关于 500 一一对称的。而 又是关于 000 一一对称的。这样我们就可以让 -499 ~ -1 用 501 ~ 999 来一一对应代替,如此就可以免去正负号!不仅如此,我们还可以很容易地根据写出的限位数是否比 500 大来判断所表示的数是正数还是负数。例如, 845 是 -155 ,因为 155 和 845 关于 500 对称,而无符号数 845 大于 500 ,所以 845 表示的是它的对称数 155 的相反数 -155 。 我们总不能到数轴上去找对称点吧?研究发现 和 的对称数之间的和都为限位数的总数 1000 。这一点让我们能够非常容易地确定一个大于 500 的数所表示的负数是多少。直观会想到用 1000-845 ,再添上负号就可以了。如此,我们就可以用无符号的限位数来表示一定范围内的正负数。由于 500 的对称数是 500 ,为了避免二义性,就规定它表示的是 -500 这个数。这样一来, 000 ~ 999 就可以用来表示 -500 ~ 499 之间的整数。限位数的这种用一定位数的无符号整数表示有符号数的规定,就称为对称制。 一般化,对称制可以如下描述。 将用数码表示的限位数按两数和是限数分成两部分对称,用较大部分数来表示其对称数的相反数,这种表示正负数的方法叫对称制。 你也许会问:“小数如何表示?” 这个问题的解决十分简单,就是只要我们隐含地认定小数点在限位数的第几位之前就可以了,不必用什么符号来记录。 4. 对称制的性质 对称制表数有如下的一些性质。 ( 1 ) 0 没有对称数。 ( 2 )限数是限位数的上界,不属于限位数。 ( 3 )最大限位数比限数值小 1. ( 4 )一个限位数的对称数可以用其反码数加 1 得出。 ( 5 )减去一个限位数可以用其对称数做加法得出结果。 ( 6 )对称制表示的实数可以保值扩充位数,正数左面添 0 ,负数左面添最大数码。 不同位数的限位数在对称制下计算,要进行位数扩充,这是是精确计算的保证。当前限位数的表值范围不够用时,扩大位数是基本的方法。例如 3 位的十进制数只能够表示 -500 ~ 499 的整数,如果要用对称制表示 -2567 这个数,那么就要扩充到 4 位,用 7433 表示。如果还要与 -18 进行加法运算,那么要将 -18 先表示成 2 位数的限位数 82 ,然后扩充成 9982 才行。这样 7433+9982 的限位数和是 7415 。而 7415 表示的值是 -2585 ,正是 -2567+(-18) 的和。 5. 加减法运算溢出 限位数运算什么时候需要扩充位数?简单地说是在加减法运算溢出的时侯。在对称制下判断溢出很简单。判断如下: ( 1 )同号两数相减和异号两数相加,不会溢出。 ( 2 )同号两数相加和异号两数相减,若运算的结果与第一个数符号相同,则不溢出,否则溢出。限位数运算的用“ = ”连接,只有数值相等才用“ = ”号连接。 例如, 587+842=429 ,因为 587 、 842 都是负数, 429 是正数,与第一个数 587 符号不同,因而是溢出的情况。因为两个负数相加的结果不能是正数。这时需要将 587 保值扩充成 9587 ,将 842 扩充成 9842 。于是 9587+9842=9429 。 验算: 587= -413 , 842= -158 , -413+(-158)= -571. 9429= -0571= -571. 6. 机器使用的是二进制 上面我们用大家熟悉的十进制表示数来介绍限位数,在计算机一类的机器计算当中,数是用二进制表示的。因为二进制只有数码 0 和 1 ,对称制的对称点是 100...0 这样的限位数,碰巧比它大的限位数最高位都是 1 ,而比它小的限位数最高位都是 0 ,所以才造成那些不求甚解的人,误认为计算机使用的数有符号位,并且认为最高位的 1 代表负号, 0 代表正号。甚至还高出了“正零”和“负零”的说辞。连初中生都知道“零没有正负”,计算机界的国内外专家们居然弄出了正负零,岂不叫人嘘唏。 实际上,在计算机内出现 10000000 ,如果认为是有符号数,那就是 -128 ,绝不是什么“负零”。当然,如果认为是无符号数,那么就是 128 。请注意, 8 位二进制数值的范围是 -128 ~ 127 ,如果是有符号数,8位的运算器表达不出 128 的。真正能表出128要至少要用 9 位,即 010000000 才是。 把计算机内部使用的二进制数最高位理解成“符号位”的人,是不会设计出好的算术运算器的一类人,不管国内还是国外。他们不能解释在计算机内为什么正负数不对称。最糟糕的是,如果运算出现了类似 10000...0 这样的边界值,他们常会感到莫名其妙。为了表数范围够用,而设计超长位数的运算器是一种愚蠢的做法。 (待续) 2016-3-28
个人分类: 机器计算|3842 次阅读|2 个评论
p与np问题的钥匙__限位数
accsys 2014-11-8 07:28
奋p与np问题多日,我已经意识到限位数理论是解决该问题的钥匙。只有用限位数方可构造非确定型图灵机。
个人分类: 计算机核|2815 次阅读|0 个评论
姜老师带你设计CPU(1)
热度 2 accsys 2014-7-30 08:07
1. 机器计算的理论 机器为什么能够代替我们人脑进行算数运算?这其中要用到限位记数的理论。限位数理论主要解决如何用固定位数的数码来表示实数,进而实现用机器来进行数值运算。 1.1. 限位记数 所谓的限位记数就是记数的位数一定的记数方法,它来源于机器记数。在纸上用数码记数时不用考虑位数,如果使用算盘,记数的位数就被限制在一定的位数上。计算机也是一种机器,用计算机记数必然是限位记数。 1.1.1. 限位记数的基本概念 利用限位数可以表示正负数,变减法运算为加法运算。用计算机实现限位数的运算需要用到反码数和对称码数的概念。 数码和限位数 人类记数普遍采用数码由右向左排列的方式。所谓的数码,就是记数的基本单位,一般用阿拉伯数字或字符记号构成。例如,十进制的数码是 0 、 1 、 2 、 3 、 4 、 5 、 6 、 7 、 8 、 9 这十个字符,十六进制用的数码是 0 、 1 、 2 、 3 、 4 、 5 、 6 、 7 、 8 、 9 、 A 、 B 、 C 、 D 、 E 、 F 。 一种进制所用的数码是有限个,相邻数码的差是 1 ,最小的数码用“ 0 ”表示,“ 1 ”是单位,这两个数码必不可少。将一个数码表示的十进制数叫数码的“值”,其中值最大的数码叫顶码,用 @ 来记。 N 是大于 1 的十进制整数,按着“逢 N 进一”的规则,用数码 0 、 1 、…、 @ 由右向左记数,就可以写出 N 进制数。其中数码有 N 个,并且有 N=@ + 1 。 定义 1‑5 如果表数的位数固定,这些数就是限位数。 N 进制的 k 位数最大的是 @@@ … @@ ,最小的数是 000 … 00 。限位数的无效数码不能省略,以表示位数。 为了方便,本书将 n 个数码重写用“ ^ n ”记在数码的右肩上。例如 9^ 5 表示 99999 。 反码 计算机设计中会用到反码,这里给出反码的定义。 定义 1‑6 如果两个数码相加的结果是顶码,称一个是另一个的反码。 例如,十进制的数码( 0 , 9 )、( 1 , 8 )、( 2 , 7 )、( 3 , 6 )、( 4 , 5 );八进制的( 0 , 7 )、( 1 , 6 )、( 2 , 5 )、( 3 , 4 );二进制的( 0 , 1 )都是互为反码。 定义 1‑7 如果将一个数的全部数码用每个数码对应的反码替换,得到的数就叫原数的反码数,也简称为反码。 显然,反码数也是相互的。 本书中,数 a 的反码记为 !a 。例如, !547 = 452 。 限位数的数量 由于一种进制中数码的个数是一定的,如果记数的位数一定,那么数的总数就被确定了。例如 3 位的十进制数一共有 1000 个,也就是 000 ~ 999 这些数。这 1000 个数不论我们认为是整数还是小数,但数码排列的形式是不会变的,总的个数也不会变。例如,可以认为有小数点在三个数码间的某一位置,但不论小数点在那里,不会影响数的总数,书写的形式也不会改变,进位的关系也不变。 从数的多少来说, 1000 是三位数个数的上限,是三位数的总数,因此称它是三位十进制数的限数。很清楚,限数是不能用固定位数表示的最小正整数,它比限位表示的最大数多一个单位 1 。对于任意进制的限位记数给出如下定义。 定义 1‑8 限位记数中数的总数叫限数。 显然记数的位数不同,那么限数也不会相同。例如在十进制中, 2 位数的限数是 100 , 3 位数的限数是 1000 , 4 位数的限数是 10000 ,… N 进制中k位数的限数U=@^ k +1,限数是不能用k位数码写出的最小数。 1. 限位数运算的特点 限位数受到记数位数的限制,因而不论进行何种运算,只要结果超出了位数的限制,结果就不可能正确了。特别是作加法或乘法时,最左面的向上进位就得丢掉。 限位数运算的这种特点,从表面上看是一种不利的方面,然而恰是限位数运算的这种“不利”,使用机器表示正负数有了基本的方法。 用数码左右排列组成的限位数,从形式上看是没有小数点和符号位的,这与通常所说的非负整数相同,也就是无符号整数。如果不特别指出,本书就用限位数代替无符号整数。 2. 限位数的对称性 限位数有一个重要的特性,这个特性可以使我们能用较大的一部分限位数来表示负数,在机器记数中不用使用“+-”符号或它们的其他代号。用限位数来表示正负数的方法,对计算机处理数运算设计十分有用。 如 图1‑1 所示,1~999是关于500成轴对称的,成轴对称的两数之和,正好是限 数 1000 。 定义 1‑9 和是限数的两个限位数的一个称为另一个的对称码。 例如, 3 位十进制数对( 001 , 999 )、( 002 , 998 )、…、( 499 , 501 )、( 500 , 500 )都是互为对称码的两个数组成的。 对称码的概念很容易得出一般的 0 和负数没有对称码的结论。由于 000 找不到一个三位数与之相加,结果为限数,故 000 没有对称码。 一个正数 a 的对称码用 a’ 来记,“ ’ ”叫求补运算符。例如, 452’ 是 548 , 548’ 是 452 。 图 1 ‑ 1 对称码的表数区间 从 图1‑1 可以看到 , -500 ~ 500 是关于原点 0 成轴对称的,因此可以建立 -500 ~ -1 与 500 ~ 999 的一一对应关系,也就是说可以用 500 ~ 999 来表示 -500 ~ -1 这些数。 3. 用限位数表示正负数 如果认为限位数 500 ~ 999 不是它们本身,而是 -500 ~ -1 ,就解决了用限位数表达正负数的问题。这样引进正负数之后,数的绝对值范围减少了一半,然而取得了机器表达正负数的关键性突破。从此在限位记数中,就可以不再使用“ + ”“ - ”号来标记一个数是正数还是负数了,在机器数值运算中也不必增加符号处理的麻烦。 由于 500 的对称码是自身,为了避免二义性,就规定对称点的数表示的是一个负数。那么表面上的 500 ,实际上是 -500 。如此,三位十进制数采用这种不带正负号的正负数表达方式,表数的范围是 -500 ~ 499 的整数。 限位记数中,用较大的一部分数表示其对称码的相反数,在形式上没有了正负号,但最终还要表达成人们熟悉的有符号的十进制数。为此将 限位数表达的十进制有符号数叫限位数的值 ,而将直接用数码书写出来无符号数,它的大小叫“表面值”。 值不论位数,可以不写无效“ 0 ”。值相等的两个限位数不论表示如何,都可以用等号“ = ”连接。例如, 628 的表面值就是 628 ,而它的值是 -372 ,可以记为 628=-372 。 4. 限位数的运算 限位数的运算是指表面值的运算,由于限位数运算的最高位进位会丢失,因而限位数运算的结果不一定与值的运算结果一致。例如,限位数的加运算是表面值的加运算,加运算的最高位进位会丢失,这正是它可能与值运算不一致的原因。 为了区分一般的数值运算和限位数的运算,特将限位数运算的表面值运算用“ ó ”连接。例如, 512 + 700 ó 212 ,结果是表面值运算的结果;而 512 的值是 -488 , 700 的值是 -300 ,故 512 + 700 =(-488)+(-300)=-788 。 看起来,限位数的表面值运算与值运算有很大的不同,但限位数的运算很多情况下与值运算是一致的。例如, 312+876 ó 188 ,结果与值运算的结果一致,因为 312 的值就是本身, 876 的值是 -124 ,值运算是 312+(-124)=188 。 在机器记数中,只要能够随时判断出限位数的表面值运算与值运算的不一致,并能够设法解决它,就可以完全用机器实现数值运算了。 1.1.2. 对称制 用无符号数来表示有符号的数,是限位记数的优点之一,特别是,这种表示可以变减法为加法运算,直接得到正确的结果,这在机器表数中十分有用。 例如 945+876 ó 821 ,如果将这些数当作值看,这是一个错误的结果。如果将它们都看成是用不带符号数来表示的有符号数,那么 945 = -055 , 876 = -124 , 821 = -179 ,那么实际值的结果完全是对的。 这种不带符号数的值的理解,很方便机器的运算设计,因而计算机中算术运算普遍使用这种无符号数表达形式。 定义 1‑10 在限位记数中,规定负数用其相反数的对称码表示,其余不变,这就是对称制。 在对称制的表数中,表面上见不到负数,实际上可以非常方便地确定某一个数表示的是否是负数。判断的方法很简单,只要将表面值与全部数的对称点比较大小,立即就可以认定实际的值是多少。例如,三位十进制数只要看是否小于对称点 500 ,是则为一个正数或 0 ,否则就是一个负数。同样四位的十进制数的正负,要和对称点 5000 进行比较就可以知道值的正负。 对于限位十进制数,对称点的最高位是 5 ,其余各位都是 0 ,所以比较时只要比较最高位的数码就可以。最高位数码小于 5 的是 0 或正数,否则是负数。根据负数的对称码表示是该限位数对称码的相反数的约定,立即就可以求得它所表示的值。 例如, 5675= - ( 10000-5675 ) = -4325 。 1.1.3. 对称码和反码的关系 根据对称码和反码的定义,很容易利用一个数的反码来求这个数的对称码。例如,四位十进制数 1234 的反码是 8765 ,而 1234 的对称码是 10000 -1234=8766 。由结果不难看到: 一个数的对称码等于这个数的反码加1 。 由前面的限位记数知道,互为反码的两个数的和的每一位都是顶码组成的数,而这个数的表面值是限位表示的最大数,与限数只差 1 ,因而可以得到求一个限位数对称码的另一重要方法。 定理 1‑1 一个限位数的对称码等于这个数的反码加1 。 利用这一结论,求一个数的对称码不用作减法,可以直接通过反码加一进行,这对于机器运算来说十分方便。 1.1.4. 对称制加法的溢出 限位记数的表数范围是一定的,如果两个限位数作加法,结果的值超出范围,那么就不能用相同位数的限位数表达出来,这种情况叫溢出。 1. 加减法溢出的判断 两个限位数相加,为了能够得到正确的值,必须判断溢出。 溢出的判断非常简单,值符号相反的两个限位数相加,一定不会溢出,也就是说,溢出只发生在值符号相同的限位数相加的过程中。 定理 1‑2 值同符号的两个限位数相加,结果改变符号才溢出,不然一定不溢出。 这个定理可以用绝对值的关系加以证明的,由于繁琐,在此不证。 值不同的两个限位数相减,可以转化成值相同的两个限位数相加,然后利用 定理 1‑2 来判断是否溢出。例如, 512-031=512+969 ó 481 ,由于 512 和 969 都是负数,相加的结果却得到了一个正数,依据 定理 1‑2 , 512-031 结果溢出。 2. 溢出的解决方法 发生溢出的两个限位数加法,产生溢出的原因是由于最高位进位丢失造成的。如果扩大一位数,表数范围扩大了,那么再作这两个数的加法,结果就不会溢出了。 例如, 780+590 ó 370 , 780 和 590 的最高位数码都大于或等于 5 ,表明它们的值都是负的,而 370 的值却是正数,可见这个表面值的加法运算发生了溢出,因而 370 不是要求的正确结果。 为了获得正确的结果,需要将固定的三位扩充到四位。扩充的关键是最高位添加什么数码。值为正数的限位数扩充,高位加无效 0 ,这样不会改变原数的值。值为负数的限位数扩充就不能高位加 0 了,因为这样会改变了原数的值。 值为负数的限位数位数扩充,可以先将它的值的相反数扩充一位,然后变成对称制表示。例如,限位数 769 的值是 -231 ,而 -231 = -0231 ,因此扩充成 4 位数的负数 -231 的对称制表示是 9769 ,而 3 位数 -231 的对称码表示是 769 。由此可得限位数位数扩充的重要方法。 定理 1‑3 值为负数的限位数位数扩充,要在填充位加顶码,不然在填充位添加“0”。 上面的 780+590 可以扩充成 9780+9590 ó 9370= -630 ,这个结果是对的,因为 780=-220 , 590= - 410 ,所以它们相加的值是 -630 。 1.1.5. 变减法为加法 限位记数不仅可以解决机器表数的正负问题,而更重要的是可以变减法运算为加法运算。例如, 123 - 456 = 123 + 544 ó 667 = -333 这种变化是将最初值的减法运算转化成了对称制表示,由于减去一个数就是加上这个数的相反数,因而减法问题变成了加法。表面值相加的结果表示的是一个负数,它的值是正确的。 这种转换不论对减数是正数还是负数都可以。再如, 743 – 821 =743+179 ó 922 = -78 , 而 743 = -257 , 821 = -179 , -257-(-179) = -78 ,运算结果正确。 出于方便记录的需要,以下 n 个相同的数码 x 连写,记为下 x^ n 。 限位记数变减法为加法的道理,可以如下认为: 设 a 、 b 是位数为 n 的限位数,那么限数是 10 n ,但它的 n 位表示形式上就是 n 个 0 组成的数。由于 a-b = a+(0^ n - b) ó a+(10 n -b) = a+b’ 这就告诉我们,形式上可以用限位记数的加法替代减法运算,当然结果有可能溢出,需要判断。如果加法运算产生溢出,可以用对称制位数扩充的方法,扩充一位得到正确的结果。 限位记数中减法可以用加法完成,这样加、减、乘、除,全部算术运算都可以用对称制加法运算来完成。
个人分类: 机器计算|4868 次阅读|2 个评论
用限位数方法设计精确浮点加减法运算器
热度 3 accsys 2011-6-10 15:35
用限位数方法设计精确浮点加减法运算器
用限位数方法设计精确浮点加减法运算器 姜咏江 (对外经济贸易大学信息学院 北京 100013 ) 摘要: 仅用二进制补码制来说明机器如何表示数值运算,存在多方面的缺失,很难说清楚机器计算的理论依据,并带来了设计冗余和资源的浪费。限位数不用书写正负号就可以表示有符号数。只用无符号数做加法就能够进行加减运算。用限位数方法设计浮点运算器,阶码不用引进移码就能够方便进行计算,而且能够方便进行尾数扩充,得到精确的计算结果。 关键词: 计算机体系结构,限位数,硬件设计,软件设计 中图分类号: TP301 , TP311 Design Exact Float’s ADD/SUB with the Fixed-Length Number Jiang Yongjiang (School of Information Technology Management Engineering,UIBE,Beijing 100013) : Abstract : Only use Binary-complement to explain the machine how to represent numerical computation, there are many losses. It is difficult to clarify the theoretical basis for machine-computation and bring the design redundancy and waste of resources. The Fixed-length number can express the value not use the '-' or '+' symbol. Only use unsigned addition will be able to carry out addition and subtraction. Use the Fixed-length number to design the float’s ADD/SUB, Exponent no need to shift and can facilitate the mantissa expansion, get accurate results. Key words : architecture, fixed-length number, hardware, software 1 引言 国际标准化组织给出的单精度 IEEE754 标准(见 图 1 )将 32 位数用一位表示尾数的正负号, 8 位做阶码,尾数 23 位,并且做了如下规定: (1) 如果 阶码 E=0 ,并且 尾数 M= 0 ,这个数是± 0 (和符号位相关); (2) 如果 阶码 E =2 255 - 1 ,并且 尾数 M= 0 ,这个数是± 无穷大 (同样和符号位相关); (3) 如果 阶码 E =2 255 1 ,并且 尾数 M ≠ 0 ,这 不是一个数(NaN ) 。 图 1 IEEE754 浮点数的格式 计算机浮点数是数学“科学记数法”表达的数,一般形式为: M × 2 E ,这种形式可以与定点数通过移动小数点的方法自由转换。 IEEE754 标准的规定不仅使一定长度数码表数范围减少了,而且失去了运用浮点数进行精确计算的可能。 本文根据限位数理论和方法 设计了 32 位可实现精确计算的浮点数加减法运算器,阶码 8 位,尾码 24 位,没有尾码的符号位。阶码 E 的值是 -128 ~ +127 的所有整数,不论 24 位尾码 M 如何, 32 位浮点格式都表示惟一确定的数。 通过保留移出数据的方式,该浮点运算器就能够运用于任意范围的浮点数精确计算。 2 限位浮点数的表示 限位数理论使用数码原样排列的算术运算来完成数值计算,同样也适合浮点数算数运算。 2.1 限位数和对称制 我们将位数固定只用数码表示的数叫“限位数”。为了表示出限位数的长度,无效数码不能够省略。两限位数之和为数的总数,那么一个叫另一个“对称数”。因而 0 和负数没有对称数。两个数码之和为最大数码时,一个叫另一个数码的“反码”。一个限位数的对称数可以用“求反加一”得到。用较大的限位数来表示其对称数的相反数, 0 就是 0 ,这就是比补码制更一般化的“对称制” 。对称制中判断数的正负只要与对称点比较即可。限位数可以直接表示一定范围的正负数,不用在运算过程中转换。保值扩充限位数,正数添“ 0 ”,负数添最大数码。 例如, 3 位十进制的限位数是 000 ~ 999 ,总数是 1000 个,其中较大的一半 501 ~ 999 的每个数都表示较小一半对称数 499 ~ 001 的相反数,对称点 500 的对称数是自身,这种情况规定为负数(基数是奇数时没有这种情况)。 2.2 用限位数表示浮点数 浮点数的限位数表示不必分为单精度或双精度,也不必将阶码用移码表示,数码的直接运算就能得到任何精确度的计算结果。由 y = M × 2 E 函数的性质知,阶码 E 的值越大, 2 E 的值越大。按着我们这里规定的阶码 8 位,尾码 24 位,浮点数直接表数范围应为: -0.838860 8 × 2 127 ~ +0.8388607 × 2 127 ,阶码的变化范围是 -128 ~ +127 的整数 。 需要指出,限位数小数点的左方是不能够随便添加“ 0 ”的,原因是限位数的最高位数码关系到该数的正负,并且小数点左面有数码就会增加限位数的位数。例如, 0.866 和 .866 在限位数表示中是不同值的,前者是一个 4 位正数,而后者是一个 3 位的负数。如果将后者变为 4 位数,左面的最高位应是添最大数码 9 ,那么应有 .866 = 9.866 。因为浮点数尾数的小数点隐含在左边的位置,并且对阶时是将较小阶码的尾数右移进行的,因而不会出现小数点左面添 0 的情况。 3 可精确计算的浮点运算器设计 限位浮点数加减法器的设计要分为对阶和计算两大步骤。对阶不会产生阶码溢出,如果用 24 位加减法器来进行第二步工作,那么设计时要考虑数据位数扩充问题。 3.1 设计思想 计算机浮点运算的不精确来自于单精度或双精度的浮点数不能根据需要进行位数扩充。浮点数在尾数移位的过程中,由于位数限制,阶码小的尾数右移时就会丢失掉一些有效数字。如果将丢失的有效数值随时能够捡回来,那么就可以实现精确的计算。 图 2 所示是两个浮点数精确加减运算的流程,其特点是直接将存储形式的数据 A 、 B 分离阶码和尾码,然后对阶和计算,移出的尾数如果包含有效数字,则将移出部分适当变化后添加到结果的尾部。 图 2 浮点数精确加减运算流程 借助于存储器我们可以将移出的尾数保留起来,这样可以根据计算的需要,改变尾数的长度。当使用固定长度的浮点加减法运算器完成超长尾数的浮点数运算时,只要将超长的尾数进行分段加减运算处理,就可以确保得到精确的运算结果。 3.2 可精确计算的浮点加减法器运算实例 根据前面提到的设计思想,作者设计了浮点数加减运算器。下面给出这个浮点运算器三张仿真图,借此来展示浮点数精确计算设计的可行性。 8 位阶码对阶时,尾码保值移动最大为 255 位。仿真 图 3 的 Name 栏下 sub=1 做减法, sub=0 做加法; f_a 与 f_b 是参加运算的两个 32 位浮点数; remain 显示移位后得到的尾数; f_out 显示加减运算 24 位的结果; 256 位的 space 显示被移出的尾码, mov_f 是移出不为 0 的标志; over 是尾数加减运算溢出标志; osign 显示 f_a 阶码与 f_b 阶码的差,为防止判定大小时溢出定为 9 位编码,最高位为 1 指示差为负。 图 3 阶码最小最大的两数相加减 图 3 中 f_a 阶码是最小数 8’h80 , f_b 阶码是最大数 8’h7F ,因而差是负数 9’h101 ,距离为 9’h0FF ,说明 f_a 的尾数右移了 255 位。也即是 24’h999999 右移了 255 位,因为它是负数,故保值右移应该用“ 1 ”补位,于是 space 的前 231 位都是 1 ,而 space 的最低位保持初始值 0 ,故而我们见到 space 的低十六进制位是 24’h333332 ,其余位全是“ F ”。稳定的运算输出需要 3 个时钟周期,故图中由加变到减运算时, over 出现 3 个节拍的溢出显示,此时的判断和减法运算无关。 如果我们要得到这两数加法运算的精确值,只要将 space 的有效数字添加在结果的后面即可。如果是做减法,并且 space 是 f_b 的移出,那么要“求反加一”,并且这种 space “求反加一”没有向上的进位时,还要将结果 f_out 的尾码减一之后与变化的 space 相连。 图 4 中两浮点数的阶码都是负数, 8’hB0 = -80 , 8’hA3 = -93 ,故 8’hB0 8’hA3 , f_b 的尾码 24’b001100100101010101110111 要右移 13 位,得剩余为 24’b000000000000000110010010=24’h000192 ,移出的部分是 =16’hABB8 。尾码加法的近似结果是 24’h6545AA ,尾码减法的近似结果是 24’h654286 。加法运算的精确结果是 40’h6545AAABB8 ;而减法运算需要先求移出的 16’b1010101110111000 对称码,即有 16’b0101010001000111 + 1’b1 = 16’b0101010001001000 = 16’h5448 ,再连接减法运算的“结果减一”,得到减法运算精确结果 40’h6542855448 。 由于精确计算只考虑移出的有效数字不是 0 ,而不是 0 的限位数对称码不会产生进位,因而当移动的是 f_b 的尾数时,减法运算的精确结果获得必须用尾数差的结果减一后去连接移出部分的对称码。 图 5 验证的是阶码相同正数浮点数加减运算,由于移出到 space 中没有有效数字,故得到的加减运算结果都应该是精确的,但加法运算的结果溢出。要解决溢出,需要将公共阶码提高单位 1 ,也就是要将两数的尾码都右移一位,这用软件的方法就可以完成。 图 4 阶码都是负数的加减运算 图 5 阶码相同的加减运算 4 结论 计算机运算器电路设计当中,一般用所谓的二进制的“补码制”,会用很多种“碰值”的手段来完成运算器的设计,这样常会“漏掉”边界值。这里运用“限位数”进行能精确计算的浮点数电路设计,不仅简单易行,节省器件资源,而且在理论上能够透彻地解释机器数值运算问题,为软硬件结合浮点数运算的精确性提供了可行的方法。 参考文献 姜咏江·计算机设计的基础理论限位数· 2009 中国计算机大会论文集· p362 姜咏江·补码制理论的理解·北京,计算机工程与应用· 2004.5 姜咏江·计算机原理综合课程设计·北京,清华大学出版社· 2009.6 姜咏江 CCF/CIE 高级会员。对外经济贸易大学副教授。主研计算机理论与设计方法,系统结构,操作系统等。 E_mail : accsys@126.com
个人分类: 机器计算|8828 次阅读|12 个评论
为了研究才发表
accsys 2010-12-21 13:33
为了促进交流,广交朋友,回避繁琐的投稿过程,共同快速进步,何不直接在博客上发表?
个人分类: 科研讨论|3517 次阅读|1 个评论
一个理论会让我们在技术上有多大收益?
accsys 2010-10-2 05:54
姜咏江 我们常说理论对技术有巨大的推动作用,限位数理论与方法对机器计算的设计就产生了这样的效果。我举两个实际设计的例子: 1. 流行的补码制硬是给数的机器表示加上一个正负号数码,因而不仅出现了正负零的概念,而且影响了实际的数值计算。长期以来让许多人搞不清楚正负号是如何参加机器数值计算的。例如,8位二进制数10000000的值是多少?是-0还是128?这种二义性是补码制的悲哀,会在计算中出现边缘错误!限位数理论会认定8位有符号二进制机器数不能表示128,10000000的值是-128,与0不搭界! 2. 将8位二进制数保值扩充成16位二进制数,在补码制中什么理由要添加符号数码? 两个极为简单且在电路设计中碰到的问题,却很少有人提出异议。其实这样简单的理论问题,会深刻影响数值电子电路设计与计算的发展。 限位数理论指出:位数固定的机器数,除去0(每位数码都是0)之外,较小的一半是值是正数,较大的一半值是负数,分界点上的数永远是负数。值相反数的数码形式相加为数的个数。 在限位数此种规定之下,我们容易推断出机器有符号数扩充的方法:正数左面添0,负数左面添最大数码。 就是在这样的理论指导之下,会让我们实际逻辑电路的设计变得更有效和容易。首先,不论对任何进制,我们不再用一个数码来表示符号,只要是一个机器数,我们就可以知道它表示的是正数还是负数,从而增加了值域。其次,值避免了二义性,软硬件结合会让我们真正实现机器的精确计算。 限位数的理论使我们精确了对机器数的认识,在浮点运算器设计上的应用(请参考http://www.sciencenet.cn/m/user_content.aspx?id=367010),你会看到使用限位数理论使数值电路的设计变得更加简单和精确。 一个理论可能会让我们改变整个技术设计方法。 2010-10-2
个人分类: 教学笔记|3697 次阅读|0 个评论
精确科学计算的工具:浮点加减运算器的限位数设计
accsys 2010-9-22 12:00
____中秋给计算机的朋友送大礼 姜咏江 1. 前言 利用计算机浮点运算器能够进行精确计算吗?利用本文设计的浮点运算器就可以进行浮点方式精确计算。 IEEE754标准将32位数用一位表示正负号,这是一种浪费。限位数方法设计浮点运算器不用占用多余的位置表示正负,因而尾数会比IEEE754标准多出一位,同样位长表示的浮点数会比IEEE754有更大的数域。用限位数方法表示浮点数,阶码也不用使用移码。 2. 设计背景 计算机浮点运算器设计中IEEE754标准强行如下规定: 1. 如果指数是0 并且小数部分是0,这个数0(和符号位相关); 2. 如果指数 = 2 e 1 并且小数部分是0,这个数是 无穷大(同样和符号位相关); 3. 如果指数 = 2 e 1 并且小数部分非0,这个数表示为不是一个数(NaN)。 这种规定不符合数值运算的规则,会造成极大偏差。 第一, 0无正负,02 0 就是0,不应该强行规定什么所谓的0; 第二, 即使指数 = 2 e 1(这里 e=8)尾数是0,此时的数值仍然是0,也不应该规定是无穷大; 第三, 指数 = 2 e 1并且小数部分非0,恰是一个确定的数,强行规定不是一个数(NaN)更违背数学原则。 3. 设计方法 本限位数浮点加减法运算器仍然采用8位的阶码设计,由于限位数自身就表示了正负,因而阶码值的变化范围是-128~127,对阶时最大移位是255。由于对称制的两限位数之差等于其所代表的有符号数之差,固可以用值较大的数减去较小的数得到8位无符号移位数。为保证精确计算的需要,特设置了移出变量 space,用它来找回移位时丢失的有效部分。 尾数右移损失有效码与否由mov_f监控,即mov_f=1时移出的数码不全为0。 限位数概念之下,规定阶码8位,尾码24位时,那么32位的浮点数其表值范围为: -0.167772162 127 ~+0.16777216 2 127 用二进制限位数的表示应是: .100000000000000000000000010 01111111 ~.011111111111111111111111010 01111111 需要指出,限位数小数点的左方是不能够随便添加0的,原因是二进制限位数的最高位数码指示着该数的正负,并且小数点左面有数码就会增加限位数表数的位数。例如,0.866和.866是不同值的,前者是一个正数,而后者是一个负数。 因为对阶时尾数右移的位数可以通过减法运算得到,加减运算的阶码需要取较大的数,因而采用大数减小数的方式就可以直接得到右移的位数。例如,阶码运算是127-(-128),化成二进制数是 0111111-10000000 = 01111111 + |10000000| = 11111111 大数减小数的结果是无符号数这是可以证明的,所以右面的结果可以认定是255。 4. 设计的Verilog HDL语言描述 /*这是我65岁年初编写的程序:限位数浮点加减法设计。阶码的变化范围是-128~127,尾数右移损失有效码由mov_f监控。这里32位的浮点数表数范围是 -0.16777216 *2exp127 ~+0.16777216 *2exp127 */ module fudian(f_a,f_b,clk,rst,me,f_out,sub,omov,mov_f,space,osign); input f_a,f_b; //输入浮点数 input clk, //时钟 me, //选择使用 rst, //复位信号 sub; //减法控制 output f_out; //结果浮点输出 output omov; //参考:移动后的尾数 output mov_f; //参考:甩掉有效数字尾标志 output space; //参考:甩掉的尾数,可以提供精确计算数据 output osign; //参考:移位数 reg f_out; //寄存器型输出 reg osign; reg exp_out; reg exp_a,exp_b; reg sign; //保证不溢出用9位 reg man_out; reg a_a,b_b,c_c; reg tru,zero,shift; reg mov_flg; assign space = shift; assign mov_f = mov_flg; assign omov = c_c; always @(posedge clk or negedge rst) begin if (!rst) begin exp_a = 8'h00; exp_b = 8'h00; a_a = 24'h000000; b_b = 24'h000000; tru = 256'hffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; zero = 256'h0000000000000000000000000000000000000000000000000000000000000000; sign = 9'b000000000; end else if (me) begin exp_a = f_a ; exp_b = f_b ; a_a = f_a ; b_b = f_b ; sign = exp_a - exp_b; end end always @(posedge clk ) begin if (!sign ) //exp_a exp_b begin osign = sign; exp_out = f_a ; //取f_a原阶码 if (b_b ) //f_b的尾数为负数 {c_c,shift} = {tru,b_b,zero} sign; //需要按负数扩充,然后右移 else {c_c,shift} = {b_b,zero} sign; end else //差为负 begin osign = -sign; exp_out = f_b ; //取f_b原阶码 if (a_a ) {c_c,shift} = {tru,a_a,zero} -sign; //需要按正负数扩充 else {c_c,shift} = {a_a,zero} -sign; end end always @(posedge clk ) begin if (!sub) //加 if (!sign ) man_out = a_a + c_c; else man_out = b_b + c_c; else //减 if (!sign ) man_out = a_a - c_c; else man_out = c_c - b_b; end always @(posedge clk ) begin f_out = {exp_out,man_out}; //输出 if (!shift) mov_flg =1'b0; else mov_flg =1'b1; //移位有损失,影响精度 end endmodule 5. 仿真 下面是十六进制的浮点加减法运算器仿真。图1是阶码符号相反的运算,求的是十六进制的0.1421762 68 0.54D1012 E5 ;图2是阶码符号相同的运算,求的是十六进制的0.1421762 68 0.0052192 73 。 图中sub=1为做减法运算。 图 1 阶码符号相反的运算 图 2 阶码符号相同的运算仿真 于2010-9-22中秋,欢迎讨论。
个人分类: 教学笔记|5135 次阅读|0 个评论
机器数间的距离
accsys 2010-7-1 10:18
姜咏江 在计算机的浮点数加减运算中需要对阶,需要将阶码小的通过尾数向右移位,使两个浮点数同阶,一般要将阶码小的变成大的阶码。尾数右移的位数是一个正整数,是由两个阶码间的距离来确定的。 两个数之间的距离是由它们的差的绝对值求出的。限位数表达的机器数之间的距离,可以通过限位数减法得到。例如,8位二进制数的阶码范围是 -128~127,只要用较大的阶码减去较小的阶码,得到的差就是阶码间的距离。-128~127范围内距离最大的是255,例如127-(-128)。 限位数间的距离和它们所表示的有符号数间的距离是一致的。例如,8位的二进制数10101100与01011110在对称制中表示的数是-84与94,0101111010101100,用 01011110-10101100 = 01011110+01010100,得到的8位结果是10110010,这是一个无符号数,值为178。而-84与94的距离正是178,可见两个限位数的差得到的无符号数就是它们所代表的数值的距离。这种规律总结出如下的定理。 定理:数值大的限位数与数值小的限位数之差得到的无符号数就是两数值的距离。 下面以二进制浮点数加减运算对阶的实例,说明机器数距离的应用。 设有浮点数a2 m 和b2 n ,m、n是8位二进制数,且mn;a、b是24位二进制纯小数;对称制下a、b、m、n都可为正负。如令m=00111000,n=10000101,那么m-n是b右移的位数,求法如下: m-n = 00111000 10000101 = 00111000 + 01111011 = 10110011 = 179。 实际上m = 56,n = -123,m-n = 179。也就是要将纯小数b右移179位才能与a做加减法运算,而结果的阶码应是00111000。 2010-7-1
个人分类: 教学笔记|3712 次阅读|0 个评论
如何判断机器数的大小
accsys 2010-6-30 17:45
姜咏江 机器数是限位数。随便给出两个机器数怎样判断大小呢? 如果认定是无符号数,那么从高位数码开始,逐一向低位比较,只要某数码较大,那么它所在的数就大。例如,1456280与6460000是无符号数,自然知道64600001456280。 如果认定是有符号数,那么1456280是一个正数,6460000是个负数,因此有64600001456280。 再举一例。 有符号机器数9999102和501谁大谁小呢?判断的方法是将它们先等值变换成相同的位数,然后再进行比较。 由最高位大于等于5是负数知,这是两个负数。故9999102=9102,501=9501,在对称制中同号两数限位数越大,表示的值越大,故91029501 即 9999102501。 实际上,9999102的值是-898,501的值是 -499,根据负数的绝对值较大的反而越小知道机器数9999102501是正确的。 总结一下: 1. 正数大于零和负数; 2. 零大于负数; 3. 符号和位数分别相同的机器数,限位数大的值也大。 此方法适用于任何进制的机器数。 2010-6-30
个人分类: 教学笔记|4593 次阅读|0 个评论
计算机中的反码与反数
accsys 2010-6-29 10:28
姜咏江 一、反码的定义 在任意进制中反码可以如下定义: 两个数码之和是最大数码,那么一个称为另一个的反码 。 例如,十进制的(0,9)(1,8)(2,7)(3,6)(4,5);二进制的(0,1);五进制的(0,4)(1,3)(2,2)等。 二、反数的定义 利用反码,进而可以定义反数: 将一个数的全部数码用其反码替换得到的数叫原数的反数 。 例如,十进制的56023的反数是43976;二进制的10100的反数是01011;五进制43021的反数是01423。 注意,反数不是相反数的。相反数是正负数意义下的概念,而反数是数码对称调换的概念。 有人也许要问:反数有什么用? 反数在计算机变减法运算为加法运算的设计中有着重要的应用。利用反数可以避开做减法得到负数的机器数表示(请参阅四)。 三、反数的性质 反数有什么性质呢? 固定位数的数叫限位数。 限位数中,两个反数之和是最大数 。 因为位数固定的限位数中,每一位数码都是最大数码的数是最大的,根据反数的定义,立即可以得到这个反数的性质。 四、对码 限位数总数一定。例如3位十进制就有1000个数。 两个限位数之和为总数(限数),一个叫另一个的对码 。 对码小的表示正数,大的表示小的相反数,这是对称制 。例如,821表示的是179的相反数(而179=1000-821)。 五、用反数求对码 在对称制中,规定负数用其相反数的对码在机器中表示。例如,3位十进制数821表示的是-179,用821求对码179就可以用求反加一来完成:821 的反数是178,再加1,则为179。我们要读821 的值,先认定821这是一个负数,然后如此求其对码,最后添加-得到数值。 2010-6-29
个人分类: 教学笔记|5677 次阅读|1 个评论
如何快速读出机器数的正负值
accsys 2010-6-29 07:55
姜咏江 用算盘(见图1)做限位数运算如何能够快速地读出数值?这需要记住两点: 1. 所有的位置都表示一位数码; 2. 正负数由算盘的最左面一位确定(大于等于5是负数)。 图 1 十进制算盘的限位数00000000 图2 在一般情况下读出的是限位数70006000。如果认定是对称制的有符号数, 那么读出的应是-29994000。这是用求反加一的口诀读出来的。 图 2读出的数是 -29994000 如果只看这个算盘的上档,那就是二进制的算盘,负数的最高位是1。图1的二进制限位数是00000000,图2 的二进制限位数是10001000。如果按有符号数读出,那么图1仍然是00000000, 而图2 读出的应是 -01111000。 计算机内部设计的运算器如同这里的算盘一样,不论你如何读,其记录的仍然是限位数。要想得到我们需要的数值形式,需要用软件的方法进一步解决。 2010-6-29
个人分类: 教学笔记|4492 次阅读|0 个评论
用机器如何进行正确计算
accsys 2010-6-28 22:06
姜咏江 我在机器如何表示正负数和进行运算中说过了:机器是用限位数的加法来完成一定范围内的正负数加减运算的。用机器设备在某一位置上能够方便地表达出N种状态,那么将这种机器设备n个排列起来,就可以制成n位能表示N进制无符号数的设备。例如只有3位的算盘,每一个位置都可以表示0~9这十个数码,合起来就能够表示000~999这1000个数,无论你怎样拨动算盘珠,也不会再出现新的数。用对称制,仍然是这1000个数,但可以表示的是-500~+499的正负数,这种值是我们读出来的,从机器表达形式来看与表示000~999没有区别。 限位数的总数有限的特性,使我们能够用它们的加法运算达到数值加减的目的,这是一般位数不受限制的表数方法所不能达到的。 限位数的加法运算的结果可能超出表示数值的范围,这叫溢出。作为对称制并不能根据限位数加法的最高位有进位来判断超出范围,而是根据异号两数相加不溢出,同号两数相加结果变号才溢出来判断的。例如 865+600的结果是465(最高进位1丢掉了),因为对称制中500以上的限位数表示的是负数,否则是正数,知两个表示负数的限位数相加的结果得到的限位数表示正数,显然错误。如果将865,600都保值扩充成4位,那么结果表示的值就不会溢出了。 限位数在对称制下保持数值扩充的方法是:正数高位添0,负值高位添最大数码。将865和600保值扩充成4位数,则865=9865=-135,600=9600=-400,那么865+600=9865+9600,这两个限位数相加的结果为9465(最高进位1丢掉了)是一个负数,它表示的值是-535,可见值的运算结果正确。 不细心研究限位数理论的人会感到奇妙,也可能不很理解。然而这是机器数值计算的真正方法,无论采用其他什么样的方式,都必将回归到限位数上来。 2010-6-28
个人分类: 教学笔记|3676 次阅读|0 个评论
简单问题却是机器计算的真道理
accsys 2010-6-24 17:12
姜咏江 我于2004年提出的限位数理论,以补码制理论的理解一文发表在《计算机工程与应用》2004年第40卷上。经过这几年在计算机设计实践中应用限位数,使我更加坚定了对机器计算的认识,同时也体会到了数值理论研究的重要意义。 用限位数解决计算机记数、运算的设计不仅道理明确,而且方法简单。对于限位数理论和方法,我也曾经疑惑是不是重新发明了轮子,因为这个问题的理论深度并不算太难,在这样重要的问题外国人为什么没研究的置疑之下,我一度也底气不足。6年过去了,没有人能够反驳我的限位数,在国内外的文献中,没发现有我所提出的这种严格的机器记数与数值运算的理论有人提出过。 我用限位数理论构造的计算机运算器,简单明了,实际设计方法很容易掌握。然而,计算机业界的人士,宁肯仍然用西方那种七拼八凑的机器数制理论,费力气地进行设计运算器(也可能就没设计),也不肯用限位数理论解放自己。我们有时太迷信西方了,不要忘记我们也会有自己的强项。 可以用限位数理论解释计算机设计中的许多问题,可以简化计算机的设计,节约成本,提高效率。限位数是有限向无限推进的一个范例,通过一套严格的理论,使人们可以用固定位数的数码表示法,通过保值扩充位数的方法,进而达到精确计算的目的。 限位数是一个简单的问题,然而却能准确地揭示任意进制之下的机器计算的原理和方法,会推动我们的计算机核心设计,值得快速推广。 如果量子计算机是用4进制进行运算的,我相信其运算器的设计一定离不开我的限位数。 2010-6-24
个人分类: 教学点滴|3786 次阅读|3 个评论
机器如何表示正负数和进行运算
accsys 2010-6-24 08:01
姜咏江 用机器来表示数既没有小数点,也没有正负号。由于机器位数的限制,那么直接表达数值的范围总是有限的。例如8位的二进制数只能表示0 ~ 255,或者-128~127。如果有减法运算存在,就只能表示-128 ~ 127,而不能作为无符号数处理。 试想一个10位的算盘,可以用10个位置表示10位的十进制数,无论将小数点的位置如何认定,就只能表示出10 10 个不同的数,不能再多了。如果我们将最高位认定为正负号,那么这一位的算盘珠只要一个就可以了,原因是正负号不能够参加加减运算。同样道理,有限位数的二进制数的最高位也不能认为是符号位,将符号混入加减数值运算的提法真是混沌,更叫人不能容忍的是这居然能够得到计算机界的承认! 用数码表示固定位数的数叫限位数。限位数直观来看就是一个无符号非负整数。要保证非负整数的特征,限位数只能做加法运算,而且运算的结果常常会超出范围。 算术运算是最基本的数值运算,其中乘除法运算可以用多次的加法运算和多次的减法运算代替。尽管如此,要进行数值计算,无论如何也离不开减法,自然就离不开负数如何用机器表示问题。 机器表示负数可不可以像手写那样给前面添加一个-号?强行加上去也可以,但在运算的时候,这一个符号位是不能够直接同数码一样进行运算的。一种巧妙的方法是利用限位数的个数有限性,按照限位数的大小对称地分成两部分(对称规则是两限位数的和是总个数),让表面上小的一部分限位数代表正数,而让较大的另一部分代表负数。相互对称的两个限位数叫对码。让较大部分的限位数代表其对码的相反数,这种用对码表示正负数的规定叫对称制。 在对称制之下,限位数表示的数值就不用+-来表示正负了。还可以通过限位数的加法运算完成它们所代表的数值加减运算。例如,3位的限位数共有1000个, 032的对码是1000-032=968,所以计算045-032时,用968表示-032就将减法运算变成了加法运算,因而045-032 = 045+968,由于3位表示的限制,最高进位丢失,故而限位数相加的结果是013,表示的值正是我们要计算的结果13。 这种求值运算的过程在机器里只能见到045、968和013,而没有+-符号,但一眼就可以知道限位数代表的数值是多少,方法是和对称点的数比较。因为3位十进制限位数的对称点是500,那么显然968是负数了。968的对码是032,根据对称制的规定,968代表的数值是-032。 用限位数加法运算替代数值的加减法运算方便了用机器进行,因为不论什么样的机器表达数的位数都是固定的,这是限位数运算的数值范围有限制的原因。 如何让机器计算能够突破数值范围的限制?下次再谈。 2010-6-24
个人分类: 教学笔记|6966 次阅读|2 个评论
机器计算的面值与真值
accsys 2010-4-6 11:20
回答某些网友的疑问 姜咏江 在计算机设计当中必须解决好机器表数的面值与所表示的真值之间的关系。任何计算机的位长都是有限的,用元器件表达的数码序列不包括小数点,也不包括正负号。许多书中提到的最高位是正负号是一种错误的理解,虽然在二进制中我们可以在补码制的规定之下,用数的最高位是1来判断这个数是一个负数,但这纯属巧合。 位数确定的数称为限位数。限位数的数量一定。例如,4位十进制数只有10000个,8位二进制数只有256个。限位数用数码写出来就是一个无符号的整数,并且无效的0不能不写。限位数不直接表达出来的无符号整数,就叫限位数的面值。限位数按着无符号整数进行算术运算,就称为面值运算。 例如,4532+7123 结果是1655,这是由于最高位进位不能用4位十进制表示丢失的缘故造成的。 正是由于限位数面值运算会丢失进位,会使我们熟悉的一般整数计算结果可能不对,故而运算之间不能用=连接,而采用变动意思的=连接。于是上例可以如下来写: 4532+7123 = 1655 常规意义下,这种面值运算没有多大用处,但在限位数中引入真值的概念,就可以用限位数面值的加法运算,完成我们的全部算术运算。 下面我们举例来说明如何规定限位数的真值,及如何用面值加法替代加减法。 例如,4位十进制数两数面值和为10000的数是一一对应的,其中一个叫另一个的补码。由于-1至-4999与1至4999也是一一对应的,9999至5001也与1至4999是一一对应的,故就可用限位数9999至5001表示-1至-4999。这样的规定使负数能用较小那部分正数的补码表示,从而取消了符号。限位数表示的平常十进制数称为限位数的真值。由于5000的补码是自身,为避免二义性,就规定5000的真值是-5000。于是4位限位数可以代表-5000至4999的整数,如果认定小数点的位置,也可以代表相应的小数。 现在用真值的表示来理解4532+7123 = 1655,那么结果是对的。因为71235000,故它真值是-2877,而4532-2877 = 1655这正是面值加法运算的结果。 因为减去一个数,等于加上这个数的相反数,故带减号的限位数真值可以用其补码表示,所以限位数的减法运算可以用加法替代。例如, 1245-7222 = 1245+2778 = 4023 这是因为7222的真值是-2778,那么1245-(-2778) = 4023,可见用限位数面值加法就可以解决一定范围内的正负数运算问题。 二进制的运算器可以用限位数面值运算的方法设计出来,最终得到的真值,需要先判断正负,再经过简单的变化才能够得到。 不知能否满足需要。 2010-4-6
个人分类: 教学点滴|4500 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-26 17:15

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部