[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

*To*: cl-cleanup@sail.stanford.edu*Subject*: New issue: IEEE-ATAN-BRANCH-CUT*From*: Guy Steele <gls@Think.COM>*Date*: Tue, 13 Dec 88 14:28:10 EST

Forum: Cleanup Issue: IEEE-ATAN-BRANCH-CUT References: CLtL p.203-214 Related issues: COMPLEX-ATAN-BRANCH-CUT Category: CHANGE Edit history: Version 1, 13-Dec-88, Steele Problem description: If an implementation provides a floating-point minus zero as well as a floating-point plus zero, most notably as in IEEE 754 floating-point arithmetic, then slight adjustments in the branch cuts of transcendental functions are appropriate. If there is a minus zero and a plus zero, then *no* complex number is actually "on the axis" whether real or imaginary. Instead, numbers of the form x+0i and x-0i straddle the real axis, and those of the form 0+xi and -0+xi straddle the imginary axis. Branch cuts that lie on the axes therefore run between such numbers, and directions of continuity are not an issue. Proposal (IEEE-ATAN-BRANCH-CUT:SPLIT): We propose to redefine the branch cut for two-argument ATAN, covering the cases where there is or is not a minus zero, and then redefine *all* other functions that have branch cuts in terms of two-argument ATAN. Specifically, we first define PHASE in terms of two-argument ATAN, and complex ABS in terms of real SQRT (which has no branch cut problems); then define complex LOG in terms of PHASE, ABS, and real LOG; then define complex SQRT in terms of LOG; and then define all others in terms of these. When I write Lisp expressions, I mean them to be taken as mathematical formulas that could be implemented in other ways for improved accuracy. (1) If there is no minus zero, two-argument ATAN behaves as in CLtL. If there is a minus zero, then some cases are modified: Condition result y=+0 x>0 +0 y=-0 x>0 -0 y=+0 x<0 +pi y=-0 x<0 -pi y=+0 x=+0 +0 y=-0 x=+0 -0 y=+0 x=-0 +pi y=-0 x=-0 -pi The range of two-argument atan therefore includes -pi in this case. Note that the case y=0 x=0 is an error in the absence of minus zero, but is defined in the presence of minus zero. (2) (PHASE X) = (ATAN (IMAGPART X) (REALPART X)), as before, but now the range of PHASE may include -PI if there is a minus zero. (3) (ABS X) = (SQRT (+ (* (REALPART X) (REALPART X)) (* (IMAGPART X) (IMAGPART X)))), as before (4) (LOG X) = (COMPLEX (LOG (ABS X)) (PHASE X)) (5) (SQRT X) = (EXP (/ (LOG X) 2)) (6) For EXPT, ASIN, ACOS, ATAN, ASINH, ACOSH, ATANH use the formulas in CLtL pp. 211-213, but use the formulas (1-5) above as the definitions of LOG and SQRT in order to determine the branch cuts properly. Examples: (LOG #c(-1.0 +0.0)) => #c(0.0 3.14159...) ;Current (LOG #c(-1.0 -0.0)) => #c(0.0 3.14159...) ;Current (LOG #c(-1.0 +0.0)) => #c(0.0 3.14159...) ;Proposed (= current) (LOG #c(-1.0 -0.0)) => #c(0.0 -3.14159...) ;Proposed (conjugate) Rationale: The current specification ignores some natural consequences of IEEE floating-point arithmetic. The proposed specification produces results more natural to that arithmetic. Current practice: Of implementations that support a minus zero that I have checked, such as Sun-4 CL 2.1.3 of 10-Nov-88 and Symbolics CL, all follow the current CLtL specification. The IEEE trig library atan2 routine written by K.C. Ng (with the advice or supervision of W. Kahan, I believe), and distributed with BSD UNIX (it is file /usr/src/usr.lib/libm/IEEE/atan2.c on my machine) follows this proposal for treatment of minus zero. Cost to Implementors: Some of the trig routines will require some rewriting. Probably certain tests that are now written using ZEROP need to be rewritten to use FLOAT-SIGN instead. Cost to Users: It is barely conceivable that some user code could depend on this. Probably there is no cost. The compatibility note on p. 210 of CLtL gave users fair warning that a change of this kind might be adopted. Cost of non-adoption: Unnatural treatment of some functions on machines supporting IEEE floating-point arithmetic. Benefits: Natural treatment, etc. Esthetics: A toss-up, except to those who care. Discussion: Steele has sent a letter to W. Kahan at Berkeley to get any last comments he may have on the matter.

- Prev by Date:
**New issue: COMPLEX-ATAN-BRANCH-CUT** - Next by Date:
**Issues: SETF-PLACES, SETF-FUNCTION-VERSUS-MACRO** - Previous by thread:
**New issue: COMPLEX-ATAN-BRANCH-CUT** - Next by thread:
**Issue: EXIT-EXTENT (Version 5)** - Index(es):