具有十进制增量!=。5的For循环会产生奇怪的结果

时间:2018-08-16 11:33:05

标签: for-loop floating-point basic c64

最初的想法

我刚刚找到了旧的Commodore 64计算机,将其连接起来,并决定再次尝试学习Basic。我刚刚结束了第3章,其中演示了一个简单的FOR循环:

10 FOR NB = 1 TO 10 STEP 1
20 PRINT NB,
30 NEXT NB

这将产生预期的结果:

1       2       3       4
5       6       7       8
9       10

介绍浮点数

将step设置为1.0时,上述结果相同。除0.5以外的其他数字会引起问题:

如果我将步长增量更改为任何而不是.5(或1),则会得到奇怪的浮点数,显然浮点数设置得越低,出现得越早。对于第一个测试,我将NB更改为1 TO 40

测试结果

  • FOR NB = 1 TO 40 STEP .6:正常结果为1–31,然后为31.6000001。为了查看是否会进一步得到怪异的结果,我将NB增加到100,然后又看到了怪异的数字从42s开始:41.2、41,8、42.4、42.9999999、43.5999999等。
  • FOR NB = 1 TO 40 STEP .4:正常结果为1–7.4,然后为7,8000001,然后正常结果为8.2–22.6,然后是22.9999999、23.3999999等。
  • FOR NB = 1 TO 40 STEP .2:正常结果为1–6.2,然后以.2表示的6.3999999递增到8.5999999,然后从8.7999998更改为9.9999998,然后是正常值从10.2。
  • FOR NB = 1 TO 40 STEP .1:正常结果为1–3.6,然后为3.6999999等。
  • FOR NB = 1 TO 40 STEP .05:正常结果为1–2.3,然后为2.34999999(请注意额外的数字),直到2.59999999,然后2.65–2.7,然后2.74999999等。

失败迭代次数

这些步骤在以下迭代中失败:

  • 0.6增量在迭代时失败
    • 52(31.6000001),
    • 51–70很好
    • 然后71-87为0.0000001到小(例如:42.9999999),
    • 然后88-103再少一个(例如:53.1999998),
    • 然后进一步减少104(例如:62.7999997)。
  • 0.4增量在迭代时失败
    • 18,
    • 19–55很好,
    • 56–64位于−.9999999,
    • 65很好,
    • 66–84位于−.9999999,
    • 85–100很好
    • 101–116是+.0000001,
    • 117继续以0.000002,依此类推。
  • 0.2增量在迭代时失败
    • 28 at -.9999999,
    • 47–107很好,
    • 108–140在+0.0000001处失败,
    • 141起+0.0000002失败,依此类推
    • 0.1增量在迭代时失败
    • 28 at -.9999999,
    • 79–88很好,
    • 89-90在+0.00000001(sic)时失败,
    • 91–116很好,
    • 117–187在+0.0000001处失败,
    • 188及更高版本在+0.0000002处失败,依此类推。
  • 0.05增量在迭代时失败
    • 28-33,位于−.00000001,
    • 34–35很好,
    • 36-68在−0.00000001处失败,
    • 69–78很好,
    • 79–92在+0.00000001处失败,
    • 93–106在+0.00000002处失败,
    • 107及更高版本在+0.00000003处失败,依此类推。

上述注意事项

为便于记录,我添加了一个计数器以简化报告;该程序因此如下所示:

05 NC = 1
10 FOR NB = 1 TO 100 STEP 0.05: REM 0.6, 0.4, 0.2, 0.1, 0.05
20 PRINT NC;":";NB,
25 NC = NC + 1
30 NEXT NB

主要问题

我怀疑问题在于如何将小数转换为二进制,但是奇怪的是它仅用.5步就可以正常工作。是什么导致此错误,以及如何纠正该错误,或​​者应该如何解决?我的准将运行Basic v2。

1 个答案:

答案 0 :(得分:5)

我想这是因为.5的倍数可以轻松转换为以2为底的原因,因此它不会产生任何问题。我敢打赌,如果您尝试使用.25增量,它也可以正常工作。