为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

各类BASIC语言中一直存在的两个错误

2013-05-27 2页 pdf 79KB 10阅读

用户头像

is_123043

暂无简介

举报
各类BASIC语言中一直存在的两个错误 各类 BASIC语言中一直存在的两个错误X 张景龙,白青海,张春生,朱世杰 (内蒙古民族大学 数学与计算机科学学院,内蒙古 通辽 028043) 1摘 要2BASIC 语言有许多版本,被许多程序设计人员所使用.然而从最早的解释型 BASIC 语言, 到后来的 编译型 BASIC语言, 从早期面向过程的 BASIC 语言,到现在面向对象的 Visual Basic语言, 却一直存在着两个 错误 ) / 整除0和/ 求余0 .本文通过简明的示例, 指出各类 BASIC 语言中存在的这两个错误. 并通过进一步分 析,找出错误...
各类BASIC语言中一直存在的两个错误
各类 BASIC语言中一直存在的两个错误X 张景龙,白青海,张春生,朱世杰 (内蒙古民族大学 数学与计算机科学学院,内蒙古 通辽 028043) 1摘 要2BASIC 语言有许多版本,被许多程序人员所使用.然而从最早的解释型 BASIC 语言, 到后来的 编译型 BASIC语言, 从早期面向过程的 BASIC 语言,到现在面向对象的 Visual Basic语言, 却一直存在着两个 错误 ) / 整除0和/ 求余0 .本文通过简明的示例, 指出各类 BASIC 语言中存在的这两个错误. 并通过进一步分 析,找出错误出现的规律, 给出解决错误的三种办法. 1关键词2BASIC 语言; 整除;求余; 错误 1中图分类号2TP312 1文献标识码2A 1文章编号21671- 0185( 2007) 06- 0623- 02 Two Errors Exist in All kinds of BASIC Programming Language All Along ZHANG Jing- long, BAI Qing- hai, ZHANG Chun- sheng , ZHU Shi- jie ( College of Mathematics and Computer Science, Inner Mongolia University for Nationalities, Tongliao 028043, China) Abstract:All kinds of BASIC programming language are used by a lot of prog rammers. However there are two errors in all kinds of BASIC programming languages. This paper shows the two er- rors w hich exist in all kinds of BASIC programming languages and f inds the rules of the tw o er- rors. At last the writers give three w ays to solve the problem. Key words: BASIC language; Divide exact ly; Module; Error BASIC语言由于使用方便而被许多人所使用, 随着面向对象程序设计语言的发展, Visual Basic语言 更是被许多开发软件的人员或者部门所使用.但是在各类 BASIC语言的各种版本中却一直存在着两个最 基本的运算错误:整除和求余.如果这两个问不被解决,使用 BASIC开发出的软件必然会引发错误的运 算结果. 1 问题的发现 从最早面向过程的 BASIC语言,到现在面向对象的Visual Basic的各种版本的BASIC语言中,整除是 一直保留的一个运算,它用/ \ 0示112.整除定义的规则是/执行除法前, 先对操作数舍入取整,所得的商 不舍入,取其整数0122. 根据整除的定义: 7 \ 1. 5= 3, 7 \ 2. 5= 2, 7. 5 \ 2= 4, 7. 5 \ 2. 5= 2, 8. 5 \ 3= 3, 8. 5 \ 2. 5= 3. 可是实际情况却并非如此: 7 \ 2. 5的结果为 3,并不是 2; 8. 5 \ 3的结果为 2,并不是 3; 7. 5 \ 2. 5= 4, 8. 5 \ 2. 5= 4. 同样的错误还发生在求余数的运算中,例如: 11 mod 3. 5= 3, 而 11 mod 4. 5的结果也为 3.以上两类 X 收稿日期: 2007- 06- 20 作者简介:张景龙( 1976- ) ,男,内蒙古赤峰人,实验师,研究方向为软件开发. 第 22 卷 第 6 期 内蒙古民族大学学报(自然科学版) Vol. 22 No . 6 2007年 12 月 Journal of Inner Mongolia University for Nationalities Dec. 2007 错误存在于现有所有版本的 BASIC语言中,并且这种两类错误遵循着共同的规律: 当操作数的整数部分 为奇数时,运算结果正确,当操作数的整数部分为偶数时,运算结果出现错误. 2 错误的原因 最容易想到的原因是计算机由于存储器位数的限制,对小数位数的存储有限,从而可能由于舍入误差 所导致的.不过经过进一步分析,显然这种原因是可以排除的. 原因有二: 1、对于 0. 5这个数来说,计算机可以精确存储,不涉及存储误差; 2、假设 0. 5不能够精确存 储,那么对于 7. 5和 2. 5两个数值的小数部分而言都是不能够精确存储的, 那么二者的小数位相同, 小数 的数值应该是一致的,或进或舍应都该遵循相同的规则,而事实上却并非如此. 由此可见完全可以排除存 储误差这种可能性. 另外硬件方面的原因也完全可以排除,笔者在 286、386、486、P1~ P4各种档次的计算机上都验证过, 错误同样存在. 所以这两个错误的产生与处理器位宽、储存器位宽的因素无关. 通过进一步测试,发现当分母整数部分为偶数时,小数部分并不是严格遵循/四舍五入0的规则,而是/五0也 要舍,只有超过/五0才/入0.例如:在双精度范围内, 7 \ 2. 500000000000000= 3,而 7 \ 2. 500000000000001= 2.也 就是说整除和求余运算在小数的舍入的问题上存在着两个标准,这必然会导致错误的运算结果. 以上这两个错误产生的原因是什么呢? 笔者认为有两种可能:一种可能是对/整除0的实现不够严格, 可能对小数舍入的界限定义的不够严格;另一种可能是 BASIC语言的编译(解释)系统本身存在着错误. 3 解决的办法 如何解决这个问题呢? 有三种办法: 第一种方法是加修正值, 即在使用整除运算前必须对操作数加以判断, 以双精度为例, 如果操作数的 整数部分是偶数而且小数部分是 0. 5,则先让操作数加上 0. 000000000000001后再运行整除运算. 假设 A 为分子, B为分母,则在凡是用到整除运算的程序中需在进入整除前进入如下判断: if ( int( A) mod 2= 0 and A- int (A) = 0. 5) then A= A+ 0. 000000000000001; if ( int( B) mod 2= 0 and B- int ( B) = 0. 5) then B= B+ 0. 000000000000001; 第二种办法是不使用整除和求余数这两种运算,而是使用除法配合取整来解决问题,对于整除用 int( int( A+ 0. 5) / int( B+ 0. 5) )进行替换; 对于求余使用除法配合取整函数和减法代替,即 int ( A+ 0. 5) - int( int( A+ 0. 5) / int( B+ 0. 5) ) * int ( B+ 0. 5) . 第三种办法是由开发 BASIC语言的微软公司重新定义整除这个操作,并且对其操作数舍入的界限进 行严格定义,这样需要将各种版本的 BASIC语言都加上补丁. 其实前两种方法无疑于淘汰了/整除0和/求余0这两种运算, 所以如果微软公司不从根本解决这两个 问题的话,我想/整除0和/求余0的运算大可以取消. 参 考 文 献 112谭浩强. ABSIC 语言结构化程序设计教程1M2.北京: 中国科学技术出版社, 1990. 18- 19. 122刘炳文, 许蔓舒. V isual Basic程序设计教程1M2.北京: 清华大学出版社, 2000. 74- 75. 1责任编辑 郑 瑛2 624 内 蒙 古 民 族 大 学 学 报 2007年
/
本文档为【各类BASIC语言中一直存在的两个错误】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索