>>>>> "Robert" == Robert Dodier <robert.dodier at gmail.com> writes:
Robert> OK, for the record, here are the results that I get for
Robert> different Lisp versions on my desktop box (linux).
Robert> GCL, Clisp, SBCL all report failure on rtest_trig # 68.
Robert> SBCL reports 2 other failures in rtest_trig.
Robert> No other test suite failures are reported.
Robert> GCL: rtest_trig problem # 68 =>
Robert> [[atanh(x),-%i/2-1/2],[atanh(x),%i/2-1/2],[atanh(x),%i/2+1/2],
Robert> [atanh(x),-%i-2],[atanh(x),%i-2],[atanh(x),-2],[atanh(x),2-%i],
Robert> [atanh(x),%i+2],[atanh(x),2],[acot(x),1/2-%i/2],[acot(x),2-%i],
Robert> [acot(x),%i+2],[atan(x),1/2-%i/2],[atan(x),%i/2+1/2],
Robert> [atan(x),%i+2],[asin(x),-1/2]]
I believe I have found the problem for this test. It's a long
standing bug, I think, in fpatan2 in float.lisp. There is a clause
there that says
((signp g (car x))
(cond ((signp g (car y)) (fpatan (fpquotient y x)))
(t (fpminus (fpatan (fpquotient y x))))))
This computes atan2(y,x) for x > 0. The last line handles the case
of y <= 0. fpatan returns a negative number and we negate it again,
so atan2(y,x) > 0 for y < 0 and x > 0. This is wrong.
I think this also explains why simpatan2 in comm2.lisp had this bit of
weird code:
(if (mminusp* y)
(neg (*fpatan (neg y) (list x)))
(*fpatan y (list x)))
There was also a bug in complex-atanh in float.lisp, which is fixed.
With these changes clisp and cmucl fails problem 68 with result
[[atanh(x), - 2], [atanh(x), 2]]. This is expected, I think because
rectform disagrees on the branch cut here. (Cmucl still fails 65, in
the same way as before.)
Ray