Browse Source

fix excess precision in return value of i386 atan[2][f]

for functions implemented in C, this is a requirement of C11 (F.6);
strictly speaking that text does not apply to standard library
functions, but it seems to be intended to apply to them, and C2x is
expected to make it a requirement.

failure to drop excess precision is particularly bad for inverse trig
functions, where a value with excess precision can be outside the
range of the function (entire range, or range for a particular
subdomain), breaking reasonable invariants a caller may expect.
master
Rich Felker 6 years ago
parent
commit
1c9afd6905
  1. 2
      src/math/i386/atan.s
  2. 3
      src/math/i386/atan2.s
  3. 3
      src/math/i386/atan2f.s
  4. 2
      src/math/i386/atanf.s

2
src/math/i386/atan.s

@ -8,6 +8,8 @@ atan:
jb 1f
fld1
fpatan
fstpl 4(%esp)
fldl 4(%esp)
ret
# subnormal x, return x with underflow
1: fsts 4(%esp)

3
src/math/i386/atan2.s

@ -4,7 +4,8 @@ atan2:
fldl 4(%esp)
fldl 12(%esp)
fpatan
fstl 4(%esp)
fstpl 4(%esp)
fldl 4(%esp)
mov 8(%esp),%eax
add %eax,%eax
cmp $0x00200000,%eax

3
src/math/i386/atan2f.s

@ -4,7 +4,8 @@ atan2f:
flds 4(%esp)
flds 8(%esp)
fpatan
fsts 4(%esp)
fstps 4(%esp)
flds 4(%esp)
mov 4(%esp),%eax
add %eax,%eax
cmp $0x01000000,%eax

2
src/math/i386/atanf.s

@ -8,6 +8,8 @@ atanf:
jb 1f
fld1
fpatan
fstps 4(%esp)
flds 4(%esp)
ret
# subnormal x, return x with underflow
1: fld %st(0)

Loading…
Cancel
Save