我正在尝试为平方根实现牛顿算法。我已经包含了完整的C程序,因此您可以看到我想要做的事情。我正在尝试在汇编中编写下面包含的C程序。现在我只是想尝试正确编写while循环。我使用命令fld accuracy
将0.0001推入堆栈。下面是我的寄存器的截图。 ST0应该是0.0001,而是9.999。我如何更正此值,以便我可以与0.0001而不是9.999进行比较..?
.586
.MODEL FLAT
.STACK 4096
.data
PUBLIC _newton
upper REAL4 9.0
accuracy REAL4 0.00001
lower REAL4 1.0
.code
_newton PROC
finit ;initialize fpu
fld upper
fld lower
fsub
fld accuracy
fcom
;if less than call code for the rest of the algorithm.
mov eax, 0
ret
_newton ENDP
END
我正在实施的算法的C版本:
double sqrtX (double x)
{
const double ACCURACY=0.00001;
double lower, upper, guess;
double number;
number = x;
lower = 1;
upper = number;
while ((upper-lower) > ACCURACY)
{
guess = (lower + upper) / 2;
if((guess * guess) > number)
{
upper = guess;
}
else
{
lower = guess;
}
}
return (lower + upper)/2;
}
答案 0 :(得分:4)
那是9.99 ... e-6 这是最接近可表示的FP值到0.00001。
你错过了科学记数法的指数部分,并且0.00001
在二进制浮点中不能完全表示。