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



原始想法

我刚刚找到我的旧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

浮点数简介

当步长设置为 1.0 时,上述结果相同。但是,除 0.5 外,其他数字会导致问题:

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

测试结果

  • FOR NB = 1 TO 40 STEP .6:1-31 的正常结果,然后是 31.6000001。为了看看我是否会得到更奇怪的结果,我将 NB 增加到 100,并看到从 42 年代开始的奇怪数字: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.39999999,直到 8.59999999,然后从 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 到 little(例如: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 在 −.9999999,
    • 47-107 很好,
    • 108–140 在 +0.0000001 处失败,
    • 141 及以上在 +0.0000002 处失败,依此类推
    • 0.1 增量在迭代时失败
    • 28 在 −.9999999,
    • 79-88 很好,
    • 89–90 在 +0.00000001 (原文如此( 时失败,
    • 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 步中工作得很好。导致此错误的原因是什么,如何修复它,或者应该如何解释它?My Commodore 运行 Basic v2。

我猜,由于 .5 的倍数可以很容易地转换为基数 2,这就是为什么它不会产生任何问题。我敢打赌,如果您尝试使用 .25 增量,它也可以正常工作。

最新更新