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

Can*_*Man 1 floating-point for-loop basic c64

创见

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

10 FOR NB = 1 TO 10 STEP 1
20 PRINT NB,
30 NEXT NB
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这会产生以下结果:

1       2       3       4
5       6       7       8
9       10
Run Code Online (Sandbox Code Playgroud)

引入浮点数

当步骤设置为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,然后是6.3999999,以.2为增量,直至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-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 at -.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
Run Code Online (Sandbox Code Playgroud)

主要问题

我怀疑问题是如何将十进制转换为二进制,但发现奇怪的是它与.5步完全正常.导致此错误的原因是什么?如何修复它,或者应该如何解释它?我的Commodore运行Basic v2.

afr*_*tor 6

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

  • 算术对于合理的分数是精确的,对于整数A和B,可以精确地表示为'A /(2 ^ B)'.0.5,0.25,0.75,0.125,0.325,0.824 ...... (2认同)