带有小数增量的 For 循环 !=.5 会产生奇怪的结果
For-loop with decimal increment !=.5 yields strange results
最初的想法
我刚刚找到我的旧 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,然后看到从 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 的正常结果,然后 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 至 little (exmpl.: 42.9999999),
- 那么88-103再减1(ex.: 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
主要问题
我怀疑问题出在如何将十进制转换为二进制,但奇怪的是它在 0.5 步的情况下工作得很好。是什么导致了这个错误,如何补救它,或者应该如何解释它?我的 Commodore 运行 Basic v2.
我猜想因为 .5 的倍数可以很容易地转换为基数 2,所以它不会产生任何问题。我敢打赌,如果您尝试使用 .25 增量,它也会正常工作。
最初的想法
我刚刚找到我的旧 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,然后看到从 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 的正常结果,然后 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 至 little (exmpl.: 42.9999999),
- 那么88-103再减1(ex.: 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
主要问题
我怀疑问题出在如何将十进制转换为二进制,但奇怪的是它在 0.5 步的情况下工作得很好。是什么导致了这个错误,如何补救它,或者应该如何解释它?我的 Commodore 运行 Basic v2.
我猜想因为 .5 的倍数可以很容易地转换为基数 2,所以它不会产生任何问题。我敢打赌,如果您尝试使用 .25 增量,它也会正常工作。