- more work on trig functions

- mkstx now checks that double wraps are not merged incorrectly
This commit is contained in:
Abdulaziz Ghuloum 2008-08-12 01:17:04 -07:00
parent 476a0cb6d8
commit b9085e15da
4 changed files with 81 additions and 18 deletions

View File

@ -382,6 +382,7 @@
exact->inexact inexact floor ceiling round log fl=? fl<? fl<=? fl>? exact->inexact inexact floor ceiling round log fl=? fl<? fl<=? fl>?
fl>=? fl+ fl- fl* fl/ flsqrt flmin flzero? flnegative? fl>=? fl+ fl- fl* fl/ flsqrt flmin flzero? flnegative?
sin cos tan asin acos atan sqrt exp sin cos tan asin acos atan sqrt exp
sinh cosh tanh asinh acosh atanh
flmax random flmax random
error@add1 error@sub1) error@add1 error@sub1)
(import (import
@ -408,6 +409,7 @@
fl=? fl<? fl<=? fl>? fl>=? fl+ fl- fl* fl/ flsqrt flmin fl=? fl<? fl<=? fl>? fl>=? fl+ fl- fl* fl/ flsqrt flmin
flzero? flnegative? sra sll exp flzero? flnegative? sra sll exp
sin cos tan asin acos atan sqrt truncate fltruncate sin cos tan asin acos atan sqrt truncate fltruncate
sinh cosh tanh asinh acosh atanh
flmax random)) flmax random))
(define (bignum->flonum x) (define (bignum->flonum x)
@ -2522,7 +2524,11 @@
[(flonum? x) (foreign-call "ikrt_fl_sinh" x)] [(flonum? x) (foreign-call "ikrt_fl_sinh" x)]
[(or (fixnum? x) (bignum? x) (ratnum? x)) [(or (fixnum? x) (bignum? x) (ratnum? x))
(sinh (inexact x))] (sinh (inexact x))]
[(number? x) (error who "not implemented" x)] [(or (compnum? x) (cflonum? x))
(let ([r (real-part x)] [i (imag-part x)])
(make-rectangular
(* (sinh r) (cos i))
(* (cosh r) (sin i))))]
[else (die who "not a number" x)]))) [else (die who "not a number" x)])))
(define cosh (define cosh
@ -2532,7 +2538,11 @@
[(flonum? x) (foreign-call "ikrt_fl_cosh" x)] [(flonum? x) (foreign-call "ikrt_fl_cosh" x)]
[(or (fixnum? x) (bignum? x) (ratnum? x)) [(or (fixnum? x) (bignum? x) (ratnum? x))
(cosh (inexact x))] (cosh (inexact x))]
[(number? x) (error who "not implemented" x)] [(or (compnum? x) (cflonum? x))
(let ([r (real-part x)] [i (imag-part x)])
(make-rectangular
(* (cosh r) (cos i))
(* (sinh r) (sin i))))]
[else (die who "not a number" x)]))) [else (die who "not a number" x)])))
(define tanh (define tanh
@ -2542,7 +2552,13 @@
[(flonum? x) (foreign-call "ikrt_fl_tanh" x)] [(flonum? x) (foreign-call "ikrt_fl_tanh" x)]
[(or (fixnum? x) (bignum? x) (ratnum? x)) [(or (fixnum? x) (bignum? x) (ratnum? x))
(tanh (inexact x))] (tanh (inexact x))]
[(number? x) (error who "not implemented" x)] [(or (compnum? x) (cflonum? x))
(let ([r (real-part x)] [i (imag-part x)])
(let ([rr (* 2 r)] [ii (* 2 i)])
(let ([cos2i (cos ii)] [cosh2r (cosh rr)])
(make-rectangular
(/ (tanh rr) (+ 1 (/ cos2i cosh2r)))
(/ (sin ii) (+ cosh2r cos2i))))))]
[else (die who "not a number" x)]))) [else (die who "not a number" x)])))
(define asinh (define asinh
@ -2552,7 +2568,22 @@
[(flonum? x) (foreign-call "ikrt_fl_asinh" x)] [(flonum? x) (foreign-call "ikrt_fl_asinh" x)]
[(or (fixnum? x) (bignum? x) (ratnum? x)) [(or (fixnum? x) (bignum? x) (ratnum? x))
(asinh (inexact x))] (asinh (inexact x))]
[(number? x) (error who "not implemented" x)] [(or (cflonum? x) (compnum? x))
(let ([x (real-part x)] [y (imag-part x)])
(cond
[(= x 0)
(let ([v (asin y)])
(make-rectangular (imag-part v) (real-part v)))]
[else
(let* ([z^2 (+ (* x x) (* y y))]
[z^2-1 (- z^2 1)]
[z^2-1^2 (* z^2-1 z^2-1)]
[y^2 (* y y)]
[q (sqrt (+ z^2-1^2 (* 4 y^2)))])
(define (sgn x) (if (< x 0) -1 1))
(make-rectangular
(* 0.5 (sgn x) (acosh (+ q z^2)))
(* 0.5 (sgn y) (acos (- q z^2)))))]))]
[else (die who "not a number" x)]))) [else (die who "not a number" x)])))
(define acosh (define acosh
@ -2569,24 +2600,38 @@
[else +nan.0])] [else +nan.0])]
[(or (fixnum? x) (bignum? x) (ratnum? x)) [(or (fixnum? x) (bignum? x) (ratnum? x))
(acosh (inexact x))] (acosh (inexact x))]
[(number? x) (error who "not implemented" x)] [(or (cflonum? x) (compnum? x))
(let ([x (real-part x)] [y (imag-part x)])
(cond
[(= x 0) (+ (asinh y) (make-rectangular 0 PI/2))]
[else
(let* ([z^2 (+ (* x x) (* y y))]
[z^2-1 (- z^2 1)]
[z^2-1^2 (* z^2-1 z^2-1)]
[y^2 (* y y)]
[q (sqrt (+ z^2-1^2 (* 4 y^2)))])
(define (sgn x) (if (< x 0) -1 1))
(+ (* 0.5 (sgn x) (acosh (+ q z^2)))
(* 0.5i (sgn y)
(- PI (* (sgn x) (acos (- q z^2)))))))]))]
[else (die who "not a number" x)]))) [else (die who "not a number" x)])))
(define atanh (define atanh
(lambda (x) (lambda (x)
(define who 'atanh) (define who 'atanh)
(cond (cond
[(flonum? x) (foreign-call "ikrt_fl_atanh" x)] [(flonum? x)
(cond
[(and (fl<=? x 1.0) (fl>=? x -1.0))
(foreign-call "ikrt_fl_atanh" x)]
[else
(- (atanh (fl/ 1.0 x))
(if (fl<? x 0.0) (* -i PI/2) (* +i PI/2)))])]
[(or (fixnum? x) (bignum? x) (ratnum? x)) [(or (fixnum? x) (bignum? x) (ratnum? x))
(atanh (inexact x))] (atanh (inexact x))]
[(number? x) (error who "not implemented" x)] [(number? x) (error who "not implemented" x)]
[else (die who "not a number" x)]))) [else (die who "not a number" x)])))
(define sin (define sin
(lambda (x) (lambda (x)
(cond (cond
@ -2650,11 +2695,23 @@
[($fl> x 1.0) [($fl> x 1.0)
(make-rectangular PI/2 (acosh x))] (make-rectangular PI/2 (acosh x))]
[($fl< x -1.0) [($fl< x -1.0)
(make-rectangular (- PI/2) (- (acosh x)))] (make-rectangular (- PI/2) (- (acosh (- x))))]
[else [else
(foreign-call "ikrt_fl_asin" x)])] (foreign-call "ikrt_fl_asin" x)])]
[(or (cflonum? x) (compnum? x)) [(or (cflonum? x) (compnum? x))
(error 'asin "not implemented for complex arguments")] (let ([x (real-part x)] [y (imag-part x)])
(cond
[(= x 0) (make-rectangular 0 (asinh y))]
[else
(let* ([z^2 (+ (* x x) (* y y))]
[z^2-1 (- z^2 1)]
[z^2-1^2 (* z^2-1 z^2-1)]
[y^2 (* y y)]
[q (sqrt (+ z^2-1^2 (* 4 y^2)))])
(define (sgn x) (if (< x 0) -1 1))
(make-rectangular
(* 0.5 (sgn x) (acos (- q z^2)))
(* 0.5 (sgn y) (acosh (+ q z^2)))))]))]
[(number? x) (asin (inexact x))] [(number? x) (asin (inexact x))]
[else (die 'asin "not a number" x)]))) [else (die 'asin "not a number" x)])))
@ -2670,7 +2727,7 @@
[else [else
(foreign-call "ikrt_fl_acos" x)])] (foreign-call "ikrt_fl_acos" x)])]
[(or (cflonum? x) (compnum? x)) [(or (cflonum? x) (compnum? x))
(error 'acos "not implemented for complex arguments")] (- PI/2 (asin x))]
[(number? x) (acos (inexact x))] [(number? x) (acos (inexact x))]
[else (die 'acos "not a number" x)]))) [else (die 'acos "not a number" x)])))

View File

@ -1 +1 @@
1585 1586

View File

@ -628,15 +628,21 @@
[* i r ba se] [* i r ba se]
[/ i r ba se] [/ i r ba se]
[abs i r ba se] [abs i r ba se]
[asin i r ba se]
[acos i r ba se] [acos i r ba se]
[atan i r ba se]
[sinh i]
[cosh i]
[tanh i]
[asinh i]
[acosh i]
[atanh i]
[angle i r ba se] [angle i r ba se]
[append i r ba se] [append i r ba se]
[apply i r ba se] [apply i r ba se]
[asin i r ba se]
[assert i r ba] [assert i r ba]
[assertion-error ] [assertion-error ]
[assertion-violation i r ba] [assertion-violation i r ba]
[atan i r ba se]
[boolean=? i r ba] [boolean=? i r ba]
[boolean? i r ba se] [boolean? i r ba se]
[car i r ba se] [car i r ba se]

View File

@ -391,7 +391,7 @@
;;; shifts cancel properly. ;;; shifts cancel properly.
(define mkstx ;;; QUEUE (define mkstx ;;; QUEUE
(lambda (e m* s* ae*) (lambda (e m* s* ae*)
(if (stx? e) (if (and (stx? e) (not (top-marked? m*)))
(let-values (((m* s* ae*) (join-wraps m* s* ae* e))) (let-values (((m* s* ae*) (join-wraps m* s* ae* e)))
(make-stx (stx-expr e) m* s* ae*)) (make-stx (stx-expr e) m* s* ae*))
(make-stx e m* s* ae*)))) (make-stx e m* s* ae*))))