x8086 程序集,将 0.0001 推入堆栈变为 9.99999.. 而不是 0.0001
x8086 Assembly, pushing 0.0001 onto stack becomes 9.99999.. instead of 0.0001
我正在尝试实现平方根的牛顿算法。我已经包含了完整的 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;
}
那是 9.99...e-6 这是最接近 0.00001 的可表示 FP 值。
您错过了科学记数法的指数部分,0.00001
不能用二进制浮点数精确表示。
我正在尝试实现平方根的牛顿算法。我已经包含了完整的 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;
}
那是 9.99...e-6 这是最接近 0.00001 的可表示 FP 值。
您错过了科学记数法的指数部分,0.00001
不能用二进制浮点数精确表示。