我在 x87 ASM 中有两个问题需要解决,我对此有点困惑,有人可以提出一些想法吗?
方程:1-(x/y)
背景:X和Y始终为正浮点数,但计算结果可以是正数,也可以是负数。这是更广泛计算的一部分,计算结果始终为正数。
问题1:X或Y可以为零(并且两者可以同时为零)。除以零是不好的。但是,如果任一值为零,我希望最终结果为“1”(即 Fld1,弹出任何不必要的数字,然后继续)
问题 2:结果必须始终落在 -1 和 +1 之间。如果结果高于 1 或低于 -1,我只想将结果替换为 1。(即,在 1-(35/0.01) 的情况下。)
到目前为止我有以下内容:
fld dword [y] ; Check if either number is 0
fmul dword [x] ;
Fldz
fcomip st(1),st(0)
je exit_1 ; If result is zero jump outta here
fld dword [y] ; Otherwise load the floats
fld dword [x]
fdivp ; Do X/Y
fld1
fsubrp ; 1 - X/Y
????? ; Need some code here to check result is between -1 and 1. If not, replace the result with "1" every time.
.exit_1
fld1 ; Use 1 as the result for the next calculation
jump to_next_calc
为了使
1 - x/y
的值低于-1,x/y > 2
,这意味着您可以提前退出
if (x >= (y + y)) return -1.0f;
拥有
=
也可以处理 x==0 and y==0
的情况,而 >
则可以处理 x>0 and y==0
的情况。
然后正常进行,输出自动限制为
[-1 .. 1]
。
理论上,通过在指数上加 1 可以加快
y
乘以 2 的速度 - 前提是该数字不是非正规数、inf 或 nan,并且不会溢出...