|
16 | 16 | ival-hypot) |
17 | 17 |
|
18 | 18 | ;; Endpoint computation for both `add`, `sub`, and `hypot` (which has an add inside) |
19 | | -(define (eplinear bffn a-endpoint b-endpoint) |
20 | | - (match-define (endpoint a a!) a-endpoint) |
21 | | - (match-define (endpoint b b!) b-endpoint) |
| 19 | +(define (eplinear bffn a a! b b!) |
22 | 20 | (define-values (val exact?) (bf-return-exact? bffn (list a b))) |
23 | | - (endpoint val (or (and a! b! exact?) (and a! (bfinfinite? a)) (and b! (bfinfinite? b))))) |
| 21 | + (values val (or (and a! b! exact?) (and a! (bfinfinite? a)) (and b! (bfinfinite? b))))) |
24 | 22 |
|
25 | | -(define (eplinear! out mpfr-fn! a-endpoint b-endpoint rnd) |
26 | | - (match-define (endpoint a a!) a-endpoint) |
27 | | - (match-define (endpoint b b!) b-endpoint) |
| 23 | +(define (eplinear! out mpfr-fn! a a! b b! rnd) |
28 | 24 | (mpfr-set-prec! out (bf-precision)) |
29 | 25 | (define exact? (= 0 (mpfr-fn! out a b rnd))) |
30 | | - (endpoint out (or (and a! b! exact?) (and a! (bfinfinite? a)) (and b! (bfinfinite? b))))) |
| 26 | + (values out (or (and a! b! exact?) (and a! (bfinfinite? a)) (and b! (bfinfinite? b))))) |
31 | 27 |
|
32 | 28 | (define (ival-add! out x y) |
33 | | - (ival (eplinear! (ival-lo-val out) mpfr-add! (ival-lo x) (ival-lo y) 'down) |
34 | | - (eplinear! (ival-hi-val out) mpfr-add! (ival-hi x) (ival-hi y) 'up) |
35 | | - (or (ival-err? x) (ival-err? y)) |
36 | | - (or (ival-err x) (ival-err y)))) |
| 29 | + (match-define (ival (endpoint xlo xlo!) (endpoint xhi xhi!) xerr? xerr) x) |
| 30 | + (match-define (ival (endpoint ylo ylo!) (endpoint yhi yhi!) yerr? yerr) y) |
| 31 | + (define-values (lo lo!) (eplinear! (ival-lo-val out) mpfr-add! xlo xlo! ylo ylo! 'down)) |
| 32 | + (define-values (hi hi!) (eplinear! (ival-hi-val out) mpfr-add! xhi xhi! yhi yhi! 'up)) |
| 33 | + (ival (endpoint lo lo!) (endpoint hi hi!) (or xerr? yerr?) (or xerr yerr))) |
37 | 34 |
|
38 | 35 | (define (ival-add x y) |
39 | 36 | (ival-add! (new-ival (bf-precision)) x y)) |
40 | 37 |
|
41 | 38 | (define (ival-sub! out x y) |
42 | | - (ival (eplinear! (ival-lo-val out) mpfr-sub! (ival-lo x) (ival-hi y) 'down) |
43 | | - (eplinear! (ival-hi-val out) mpfr-sub! (ival-hi x) (ival-lo y) 'up) |
44 | | - (or (ival-err? x) (ival-err? y)) |
45 | | - (or (ival-err x) (ival-err y)))) |
| 39 | + (match-define (ival (endpoint xlo xlo!) (endpoint xhi xhi!) xerr? xerr) x) |
| 40 | + (match-define (ival (endpoint ylo ylo!) (endpoint yhi yhi!) yerr? yerr) y) |
| 41 | + (define-values (lo lo!) (eplinear! (ival-lo-val out) mpfr-sub! xlo xlo! yhi yhi! 'down)) |
| 42 | + (define-values (hi hi!) (eplinear! (ival-hi-val out) mpfr-sub! xhi xhi! ylo ylo! 'up)) |
| 43 | + (ival (endpoint lo lo!) (endpoint hi hi!) (or xerr? yerr?) (or xerr yerr))) |
46 | 44 |
|
47 | 45 | (define (ival-sub x y) |
48 | 46 | (ival-sub! (new-ival (bf-precision)) x y)) |
|
161 | 159 | (define (ival-hypot! out x y) |
162 | 160 | (define err? (or (ival-err? x) (ival-err? y))) |
163 | 161 | (define err (or (ival-err x) (ival-err y))) |
164 | | - (define x* (ival-exact-fabs x)) |
165 | | - (define y* (ival-exact-fabs y)) |
166 | | - (ival (eplinear! (ival-lo-val out) mpfr-hypot! (ival-lo x*) (ival-lo y*) 'down) |
167 | | - (eplinear! (ival-hi-val out) mpfr-hypot! (ival-hi x*) (ival-hi y*) 'up) |
168 | | - err? |
169 | | - err)) |
| 162 | + (match-define (ival (endpoint xlo xlo!) (endpoint xhi xhi!) _ _) (ival-exact-fabs x)) |
| 163 | + (match-define (ival (endpoint ylo ylo!) (endpoint yhi yhi!) _ _) (ival-exact-fabs y)) |
| 164 | + (define-values (lo lo!) (eplinear! (ival-lo-val out) mpfr-hypot! xlo xlo! ylo ylo! 'down)) |
| 165 | + (define-values (hi hi!) (eplinear! (ival-hi-val out) mpfr-hypot! xhi xhi! yhi yhi! 'up)) |
| 166 | + (ival (endpoint lo lo!) (endpoint hi hi!) err? err)) |
170 | 167 |
|
171 | 168 | (define (ival-hypot x y) |
172 | 169 | (ival-hypot! (new-ival (bf-precision)) x y)) |
0 commit comments