acos.s fix: use the formula acos(x) = atan2(sqrt(1-x),sqrt(1+x))
authornsz <nsz@port70.net>
Thu, 22 Mar 2012 13:54:47 +0000 (14:54 +0100)
committernsz <nsz@port70.net>
Thu, 22 Mar 2012 13:54:47 +0000 (14:54 +0100)
the old formula atan2(1,sqrt((1+x)/(1-x))) was faster but
could give nan result at x=1 when the rounding mode is
FE_DOWNWARD (so 1-1 == -0 and 2/-0 == -inf), the new formula
gives -0 at x=+-1 with downward rounding.

src/math/i386/acos.s
src/math/x86_64/acosl.s

index 4f0168f..bfff0c5 100644 (file)
@@ -18,12 +18,10 @@ acos:
        fld %st(1)
        fld1
        fsubp
+       fsqrt
        fxch %st(2)
        faddp
-       fdivp
        fsqrt
-       fld1
-       fxch %st(1)
        fpatan
        fld1
        fld1
index 92c2987..db68d2d 100644 (file)
@@ -6,12 +6,10 @@ acosl:
        fld %st(1)
        fld1
        fsubp
+       fsqrt
        fxch %st(2)
        faddp
-       fdivp
        fsqrt
-       fld1
-       fxch %st(1)
        fpatan
        fld1
        fld1