瀏覽代碼

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.
Rich Felker 5 年之前
父節點
當前提交
1c9afd6905
共有 4 個文件被更改,包括 8 次插入2 次删除
  1. 2 0
      src/math/i386/atan.s
  2. 2 1
      src/math/i386/atan2.s
  3. 2 1
      src/math/i386/atan2f.s
  4. 2 0
      src/math/i386/atanf.s

+ 2 - 0
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)

+ 2 - 1
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

+ 2 - 1
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 - 0
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)