|
15 | 15 | new-ival |
16 | 16 | ival-exact-fabs |
17 | 17 | ival-maybe |
18 | | - epfn |
| 18 | + epfn1 |
| 19 | + epfn2 |
19 | 20 | split-ival |
20 | 21 | ival-max-prec |
21 | 22 | ival-exact-neg |
|
206 | 207 | (or (ival-err? x) (ival-err? y)) |
207 | 208 | (and (ival-err x) (ival-err y)))] |
208 | 209 | [(boolean? (ival-lo-val x)) |
209 | | - (ival (epfn and-fn (ival-lo x) (ival-lo y)) |
210 | | - (epfn or-fn (ival-hi x) (ival-hi y)) |
| 210 | + (ival (epfn2 and-fn (ival-lo x) (ival-lo y)) |
| 211 | + (epfn2 or-fn (ival-hi x) (ival-hi y)) |
211 | 212 | (or (ival-err? x) (ival-err? y)) |
212 | 213 | (and (ival-err x) (ival-err y)))])) |
213 | 214 |
|
214 | | -;; This function computes and propagates the immovable? flag for endpoints |
215 | | -(define (epfn op . args) |
216 | | - (define args-bf (map endpoint-val args)) |
217 | | - (define-values (result exact?) (bf-return-exact? op args-bf)) |
218 | | - (endpoint result (and (andmap endpoint-immovable? args) exact?))) |
| 215 | +;; These functions compute and propagate the immovable? flag for endpoints |
| 216 | +(define (epfn1 op arg) |
| 217 | + (define-values (result exact?) (bf-return-exact? op (list (endpoint-val arg)))) |
| 218 | + (endpoint result (and (endpoint-immovable? arg) exact?))) |
| 219 | + |
| 220 | +(define (epfn2 op arg0 arg1) |
| 221 | + (define-values (result exact?) |
| 222 | + (bf-return-exact? op (list (endpoint-val arg0) (endpoint-val arg1)))) |
| 223 | + (endpoint result (and (endpoint-immovable? arg0) |
| 224 | + (endpoint-immovable? arg1) |
| 225 | + exact?))) |
219 | 226 |
|
220 | 227 | ;; Helpers for defining interval functions |
221 | 228 |
|
|
224 | 231 |
|
225 | 232 | (define ((monotonic bffn) x) |
226 | 233 | (match-define (ival lo hi err? err) x) |
227 | | - (ival (rnd 'down epfn bffn lo) (rnd 'up epfn bffn hi) err? err)) |
| 234 | + (ival (rnd 'down epfn1 bffn lo) (rnd 'up epfn1 bffn hi) err? err)) |
228 | 235 |
|
229 | 236 | (define ((comonotonic bffn) x) |
230 | 237 | (match-define (ival lo hi err? err) x) |
231 | | - (ival (rnd 'down epfn bffn hi) (rnd 'up epfn bffn lo) err? err)) |
| 238 | + (ival (rnd 'down epfn1 bffn hi) (rnd 'up epfn1 bffn lo) err? err)) |
232 | 239 |
|
233 | 240 | (define ((close-enough->ival bffn) x) |
234 | 241 | (match-define (ival (endpoint lo lo!) (endpoint hi hi!) err? err) x) |
|
302 | 309 | [0 |
303 | 310 | (match-define (ival (endpoint xlo xlo!) (endpoint xhi xhi!) xerr? xerr) x) |
304 | 311 | (ival (endpoint (bf 0) (and xlo! xhi!)) |
305 | | - (rnd 'up endpoint-max2 (epfn bfabs (ival-lo x)) (ival-hi x)) |
| 312 | + (rnd 'up endpoint-max2 (epfn1 bfabs (ival-lo x)) (ival-hi x)) |
306 | 313 | (ival-err? x) |
307 | 314 | (ival-err x))])) |
308 | 315 |
|
|
355 | 362 | (ormap ival-err as))) |
356 | 363 |
|
357 | 364 | (define (ival-not x) |
358 | | - (ival (epfn not (ival-hi x)) (epfn not (ival-lo x)) (ival-err? x) (ival-err x))) |
| 365 | + (ival (epfn1 not (ival-hi x)) (epfn1 not (ival-lo x)) (ival-err? x) (ival-err x))) |
359 | 366 |
|
360 | 367 | (define* ival-asin (compose (monotonic bfasin) (clamp -1.bf 1.bf))) |
361 | 368 | (define* ival-acos (compose (comonotonic bfacos) (clamp -1.bf 1.bf))) |
|
369 | 376 | (define err (or (ival-err x) (ival-err y))) |
370 | 377 |
|
371 | 378 | (define (mkatan a b c d) |
372 | | - (ival (rnd 'down epfn bfatan2 a b) (rnd 'up epfn bfatan2 c d) err? err)) |
| 379 | + (ival (rnd 'down epfn2 bfatan2 a b) (rnd 'up epfn2 bfatan2 c d) err? err)) |
373 | 380 |
|
374 | 381 | (match* ((classify-ival-strict x) (classify-ival-strict y)) |
375 | 382 | [(-1 -1) (mkatan yhi xlo ylo xhi)] |
|
404 | 411 | (define* ival-erfc (comonotonic bferfc)) |
405 | 412 |
|
406 | 413 | (define (ival-cmp x y) |
407 | | - (define can-< (epfn bflt? (ival-lo x) (ival-hi y))) |
408 | | - (define must-< (epfn bflt? (ival-hi x) (ival-lo y))) |
409 | | - (define can-> (epfn bfgt? (ival-hi x) (ival-lo y))) |
410 | | - (define must-> (epfn bfgt? (ival-lo x) (ival-hi y))) |
| 414 | + (define can-< (epfn2 bflt? (ival-lo x) (ival-hi y))) |
| 415 | + (define must-< (epfn2 bflt? (ival-hi x) (ival-lo y))) |
| 416 | + (define can-> (epfn2 bfgt? (ival-hi x) (ival-lo y))) |
| 417 | + (define must-> (epfn2 bfgt? (ival-lo x) (ival-hi y))) |
411 | 418 | (values can-< must-< can-> must->)) |
412 | 419 |
|
413 | 420 | (define (ival-<2 x y) |
|
416 | 423 |
|
417 | 424 | (define (ival-<=2 x y) |
418 | 425 | (define-values (c< m< c> m>) (ival-cmp x y)) |
419 | | - (ival (epfn not c>) (epfn not m>) (or (ival-err? x) (ival-err? y)) (or (ival-err x) (ival-err y)))) |
| 426 | + (ival (epfn1 not c>) (epfn1 not m>) (or (ival-err? x) (ival-err? y)) (or (ival-err x) (ival-err y)))) |
420 | 427 |
|
421 | 428 | (define (ival->2 x y) |
422 | 429 | (define-values (c< m< c> m>) (ival-cmp x y)) |
423 | 430 | (ival m> c> (or (ival-err? x) (ival-err? y)) (or (ival-err x) (ival-err y)))) |
424 | 431 |
|
425 | 432 | (define (ival->=2 x y) |
426 | 433 | (define-values (c< m< c> m>) (ival-cmp x y)) |
427 | | - (ival (epfn not c<) (epfn not m<) (or (ival-err? x) (ival-err? y)) (or (ival-err x) (ival-err y)))) |
| 434 | + (ival (epfn1 not c<) (epfn1 not m<) (or (ival-err? x) (ival-err? y)) (or (ival-err x) (ival-err y)))) |
428 | 435 |
|
429 | 436 | (define (ival-==2 x y) |
430 | 437 | (define-values (c< m< c> m>) (ival-cmp x y)) |
431 | | - (ival (epfn and-fn (epfn not c<) (epfn not c>)) |
432 | | - (epfn and-fn (epfn not m<) (epfn not m>)) |
| 438 | + (ival (epfn2 and-fn (epfn1 not c<) (epfn1 not c>)) |
| 439 | + (epfn2 and-fn (epfn1 not m<) (epfn1 not m>)) |
433 | 440 | (or (ival-err? x) (ival-err? y)) |
434 | 441 | (or (ival-err x) (ival-err y)))) |
435 | 442 |
|
|
449 | 456 |
|
450 | 457 | (define (ival-!=2 x y) |
451 | 458 | (define-values (c< m< c> m>) (ival-cmp x y)) |
452 | | - (ival (epfn or-fn m< m>) |
453 | | - (epfn or-fn c< c>) |
| 459 | + (ival (epfn2 or-fn m< m>) |
| 460 | + (epfn2 or-fn c< c>) |
454 | 461 | (or (ival-err? x) (ival-err? y)) |
455 | 462 | (or (ival-err x) (ival-err y)))) |
456 | 463 |
|
|
524 | 531 | (define err? (or (ival-err? y) xerr?)) |
525 | 532 | (define err (or (ival-err y) xerr)) |
526 | 533 | (match* (can-neg can-pos) |
527 | | - [(#t #t) (ival (rnd 'down epfn bfneg xhi) (rnd 'up epfn bfcopy xhi) err? err)] |
528 | | - [(#t #f) (ival (rnd 'down epfn bfneg xhi) (rnd 'up epfn bfneg xlo) err? err)] |
| 534 | + [(#t #t) (ival (rnd 'down epfn1 bfneg xhi) (rnd 'up epfn1 bfcopy xhi) err? err)] |
| 535 | + [(#t #f) (ival (rnd 'down epfn1 bfneg xhi) (rnd 'up epfn1 bfneg xlo) err? err)] |
529 | 536 | [(#f #t) (ival xlo xhi err? err)] |
530 | 537 | [(#f #f) |
531 | 538 | (unless (ival-err y) |
|
0 commit comments