gpt4 book ai didi

function - 牛顿拉夫森迭代问题

转载 作者:行者123 更新时间:2023-12-02 08:04:26 26 4
gpt4 key购买 nike

我正在 MASM X8086-32 位程序集中编写一个 8 位整数牛顿拉夫森函数,我认为我陷入了无限循环。我必须用于类的编辑器不会发送无限循环的错误。

无论如何,我不确定我的问题出在哪里。我几周前刚刚开始使用 MASM,我对无限循环失去了任何帮助,我们将不胜感激。我的初始 x 值定义为 1。

函数为 y = 1/2(x+n/x) ===> x/2+ n/2x,其中 n 是所讨论的数字。 x 是初始化值,然后是之前迭代的 y 值。

    mov ah, 09h
lea dx, prompt ;Prompt User
int 21h

mov ah, 01h
int 21h ;User input
sub al, 30h

mov bh, al
mov bl, x ;Loading for loop
mov al, x

iteration:
mul bl; al*bl = al

mov dl, al ; storing x^2

add al, 01h ; (x+1)^2
mul al

cmp bh, dl
jge doneCheck ; bh - dl ====> n- x^2 => 0
doneCheck:
cmp bh, al; bh-al = ? ====>n - (x+1)^2 == -int
jl done

mov al, 02h; loading 2 in ah
mul bl ; bl*al = 2(bl) = 2x = al

shr bl, 1 ; x/2 = bl

mov cl, al ; storing 2x in cl
mov ah, 0 ; clearing ah
mov ch, 0; clearing ch
mov al, bh ; moving n into ax for division prep
div cx ; ax/cl ====> n/2x ===> p =ah and q = al

add bl, ah ;so this is finally 1/2(x+(n/x)) === (x/2+n/2x) y the new value y is now stored in bl for next loop
mov al, bl ; for next loop
jmp iteration

done:

mov dl, bl; print square root
mov ah, 02h
int 21h

最佳答案

这个:

shl bl, 1 ; x/2 = bl

不应该吗?:

shr bl,1

--更新:

关于你的问题:

BH = Number to find sqrt. When x^2 == BH then x is the sqrt(n)
AL and BL = y value of the last iteration

你会:

mul bl     ; AL*BH => AX
cmp bh, al ; BH == AL? or with names: n == x^2 ?

为什么是无限循环?:

当您使用 AH=01h+int 21h 进行输入时,您只读取一个字符,就会得到 ascii code在阿拉巴马州。

假设用户输入的数字是“A”,它被转换为数字65。无论如何,任何整数都会给你 x^2 = 65,因此该循环将永远循环。

我建议您使用此条件作为循环中断。结果将是一个近似值(四舍五入到较小的数字):

(n >= x^2) && (n < (x+1)^2)

请记住,您正在使用 8 位,因此最高的解决方案是:y = 15。看看这个:

1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16
5^2 = 25
6^2 = 36
7^2 = 49
8^2 = 64
...
15^2 = 225

这些是您可以使用代码计算 sqrt 的唯一数字(无需我的建议)

所以你只能按以下键作为输入:

$ = number 36
1 = number 49
@ = number 64
Q = number 81
d = number 100
y = number 121

这些之间的任何按键都会使您的代码进入无限循环。

关于输出的提示:在打印之前将 48 添加到 BL,这样它就会变成 ASCII 数字:)

-- 更新 2:

从你的代码中我发现了这个错误:

add al, 01h ; (x+1)^2 ; AL = x^2, therefore you are doing (x^2)+1
mul al

这里的执行流程将始终执行所有行:

cmp bh, dl
jge doneCheck ; bh >= dl? ====> n >= x^2 ?
doneCheck:
cmp bh, al; bh-al = ? ====>n - (x+1)^2 == -int
jl done

我想应该是这样的:

  cmp bh, dl     ; n vs x^2
jb notSolution ; BH < DL? ====> if n < x^2 continue with next NR step
cmp bh, al ; here, n >= x^2
jb done ; BH < AL ? ====> if n < (x+1)^2 we found a solution

notSolution: ; n is not in [ x^2 , (x+1)^2 )

我使用 jb 而不是 jl 因为我只假设正数。 jl 会将 129 视为负数,也许我们会遇到麻烦。

--更新3:

来自Peter Cordes'回答,一个我没有注意到的细节(我读了 div cl):

div cx ; ax/cl ====> n/2x ===> p =ah and q = al. That would be correct if you'd used div cl

关于function - 牛顿拉夫森迭代问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40331994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com