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 不能用二进制浮点数精确表示。