debugging - 看似由非复对数产生的复数

标签 debugging binary base-conversion ti-basic

我有一个用 TI-BASIC 编写的简单程序,可以将基数 10 转换为基数 2

0->B
1->E
Input "DEC:",D
Repeat D=0
int(round(log(D)/log(2),1))->E
round(E)->E
B+10^E->B
D-2^E->D
End
Disp B

这有时会返回错误“ERR: DATA TYPE”。我查了一下,这是因为变量D,有时会变成复数。我不确定这是怎么发生的。

这种情况发生在看似随机的数字上,比如 5891570。它发生在这个数字上,但不会发生在接近它的数字上,比如 5891590,这很奇怪。 1e30 也会出现这种情况,但 1e25 不会出现这种情况。另一个例子是 1111111111111111,而不是 1111111111111120。

我还没有对此进行彻底测试,并且在这些数字中没有看到任何模式。任何帮助将不胜感激。

最佳答案

发生该错误的原因是您在取整数部分之前将对数四舍五入到小数点后一位;因此,如果 log(D)/log(2)类似于 8.99 ,您将舍入E向上而不是向下,并且 2^9将从 D 中减去,而不是 2^8 ,导致在下一次迭代中 D变为负数,其对数变为复数。让我们看一下当 D 为 511 时的代码。 ,其以 2 为底的对数 8.9971 :

Repeat D=0          ;Executes first iteration without checking whether D=0
log(D)/log(2        ;8.9971
round(Ans,1         ;9.0
int(Ans             ;9.0
round(Ans)->E       ;E = 9.0
B+10^E->B           ;B = 1 000 000 000
D-2^E->D            ;D = 511-512 = -1
End                 ;loops again, since D≠0
---next iteration:----
log(D               ;log(-1) = 1.364i; throws ERR:NONREAL ANS in Real mode

对数舍入超过九个小数位(九位数字是 round( 没有“数字”参数的默认值)是完全没有必要的,因为在我的 TI-84+ 上舍入错误不会累积: round(int(log(2^X-1)/log(2))返回 X-1 和 round(int(log(2^X)/log(2))对于所有整数 X≤28,返回 X,该值足够高,以至于在计算的其他部分中无论如何都会丢失精度。

要修复代码,只需四舍五入一次,并且只舍入到九位。我还删除了不必要的双重初始化 E ,删除了你的近括号(它仍然是合法的代码!),并更改了 Repeat (在检查条件 D=0 之前始终执行一个循环)到 While防止循环ERR:DOMAIN当输入为0时。

0->B
Input "DEC:",D
While D
int(round(log(D)/log(2->E
B+10^E->B
D-2^E->D
End
B            ;on the last line, so it prints implicitly

不要指望您的代码或我的修复程序能够在 D > 213 左右正确工作,因为您的计算器只能在任何数字的内部表示形式中存储 14 位数字。当您将结果存储到 B 中时,您将丢失数字!

现在采用一种更棘手、优化的方式来计算二进制表示(仍然仅适用于 D <213:

Input D
int(2fPart(D/2^cumSum(binomcdf(13,0 
.1sum(Ans10^(cumSum(1 or Ans

关于debugging - 看似由非复对数产生的复数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31777560/

相关文章:

Ruby:将整数转换为 32 位二进制数(或字符串)

java - 将二进制字符串转换为十六进制字符串JAVA

binary - 将重复的二进制数转换为十进制(表示为系列?)

python - 十六进制十进制浮点Python

node.js - 如何在 WebStorm Node.js 远程调试中调试 TypeScript?

c# - 如何调试 UWP xaml 绑定(bind)?

asp.net - 如何调试已部署的网站

java - 用于二进制十进制转换的两部分代码未给出分数二进制数的所需输出

python - 将列表从 ord 转换为 List

c - 尝试在调试期间进行不需要的附加