x8086汇编,将0.0001推入堆栈变为9.99999 ..而不是0.0001

时间:2018-04-21 19:19:52

标签: assembly floating-point floating-point-conversion x87

我正在尝试为平方根实现牛顿算法。我已经包含了完整的C程序,因此您可以看到我想要做的事情。我正在尝试在汇编中编写下面包含的C程序。现在我只是想尝试正确编写while循环。我使用命令fld accuracy将0.0001推入堆栈。下面是我的寄存器的截图。 ST0应该是0.0001,而是9.999。我如何更正此值,以便我可以与0.0001而不是9.999进行比较..? xcv

.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;
}

1 个答案:

答案 0 :(得分:4)

那是9.99 ... e-6 这是最接近可表示的FP值到0.00001。

你错过了科学记数法的指数部分,并且0.00001在二进制浮点中不能完全表示。