回 帖 发 新 帖 刷新版面

主题:关于乘方的问题

[em8]
    一个打印出所有的水仙花(指一个三位数,其各位数立方和等于该数)的数相关事例,我编写的程序如下:
cls
for i=100 to 999
    a=i mod 10
    b=i\10 mod 10
    c=i\100
    if a^3+b^3+c^3=i then print i;
next i
end

    我认为这个程序没什么问题,但还是输入电脑运行一下,可是屏幕上没有任何输出,试过几次,结果依然如故。
    在纳闷之余,把a^3+b^3+c^3=i 改成了 a*a*a+b*b*b+c*c*c=i 后,再次运行程序,却显示正确的结果。在思索a^3表示的是a的三次方,而a*a*a也是,却差别如此之大呢?
    在百思不得齐解之时,试过许多关于a^3的问题都可以输出,而唯独此题却不能,但当再次对程序修改,把if a^3+b^3+c^3=i then print i;改成以下几行:
      x=a^3:y=b^3:z=c^3
      if x+y+z=i then print i;
后,程序却又能运行,输出结果了。
    心想:难道使用乘方语句时,也有什么讲究,它只能对直接变量乘方,而不能对间接的变量乘方??
    真得好想搞清这样的问题,也想搞清楚QBASIC在应用中是否还有这样类似的问题,如果不能给学生一个明确的答复,真的就成了误人子弟了。谢谢大家支持!

回复列表 (共5个回复)

沙发

是实型变量在处理过程中产生了误差。

比如,把你的程序中的第二行改为i = 153(153是水仙花数), 倒数第二行删除。按“F8”单步调试,运行到第五行的时候,按“F6”转到立即窗口,输入PRINT a^3+b^3+c^3-i,按回车,但输出的结果并不是0,而是-4.1633336E-17,这是一个比0小一点点的数,但是它并不等于0,因为在进行“^”运算时,结果是实型,这样实型变量在处理中就产生了误差,就会出现不可思议的结果。

板凳

[quote]是实型变量在处理过程中产生了误差。

在进行“^”运算时,结果是实型,这样实型变量在处理中就产生了误差,就会出现不可思议的结果。[/quote]

    通过你的解释,我明白了" ^ "运算结果是实型,易引起误差。
    我还有一点疑问,为什么用x=a^3:y=b^3:z=c^3这里的x,y,z是单精度,而if x+y+z=i then print i;却不出问题呢?单精度是实型吧?

    还有:那以后乘方的问题,还要慎用了,如果是a的n次方,果真要写成n个a相乘的形式吗?有没有良方呢?

3 楼

掌握陷阱,避免陷阱,这,就是你的技术。

乘方的确比乘法函数要稍慢,
而单精度变量运算,是会产生小小的误差。
你题目已知,分析一下,没有必要去使用精度变量,
使用整形变量就能很好的解决问题了。

在程序代码前加一行:
defint A-Z
默认定义所有变量为短整形变量。你再试试看?

4 楼

程序前加:defint A-Z
程序运行结果依然如故.
如果对a,b,c分别定义整型或长整型也错.
如果改成整型,长整型可正确求解的话,这个程序部分段改成:
x=a^3:y=b^3:z=c^3
if x+y+z=i then print i;
程序运行却正常,就不好解释了,因为x,y,z也是单精度又不是整型。
如果说乘方(^)应用是有限制的,到也许能解释清楚。还是纳闷。

5 楼

呵呵,那就认为那乘方函数有误差不严谨吧,记住并避免使用或提高适应性就好,
比如说它们之差小于0.001之类的.呵呵.

 IF ABS(a ^ 3 + b ^ 3 + c ^ 3 - i) < .0001 THEN PRINT i;

我来回复

您尚未登录,请登录后再回复。点此登录或注册