1-(x/y)方程让人头疼

问题描述 投票:0回答:1

我在 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
fld dword [x] ;  
fmulp        ; By multiplying together
fcomp st(0) ; And doing a comp with itself
jz 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
assembly x87
1个回答
0
投票

为了使

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,并且不会溢出...

© www.soinside.com 2019 - 2024. All rights reserved.