Skip to content

Commit 8cfe949

Browse files
committed
Hook up lots of new mutating operations
1 parent 295a282 commit 8cfe949

File tree

3 files changed

+76
-73
lines changed

3 files changed

+76
-73
lines changed

eval/compile.rkt

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,37 +35,37 @@
3535

3636
[(list 'if c y f) (list ival-if c y f)]
3737

38-
[(list 'neg x) (list ival-neg x)]
39-
[(list 'acos x) (list ival-acos x)]
40-
[(list 'acosh x) (list ival-acosh x)]
41-
[(list 'asin x) (list ival-asin x)]
42-
[(list 'asinh x) (list ival-asinh x)]
43-
[(list 'atan x) (list ival-atan x)]
44-
[(list 'atanh x) (list ival-atanh x)]
45-
[(list 'cbrt x) (list ival-cbrt x)]
38+
[(list 'neg x) (list ival-neg! (alloc-outreg!) x)]
39+
[(list 'acos x) (list ival-acos! (alloc-outreg!) x)]
40+
[(list 'acosh x) (list ival-acosh! (alloc-outreg!) x)]
41+
[(list 'asin x) (list ival-asin! (alloc-outreg!) x)]
42+
[(list 'asinh x) (list ival-asinh! (alloc-outreg!) x)]
43+
[(list 'atan x) (list ival-atan! (alloc-outreg!) x)]
44+
[(list 'atanh x) (list ival-atanh! (alloc-outreg!) x)]
45+
[(list 'cbrt x) (list ival-cbrt! (alloc-outreg!) x)]
4646
[(list 'ceil x) (list ival-ceil x)]
4747
[(list 'cos x) (list ival-cos x)]
48-
[(list 'cosh x) (list ival-cosh x)]
49-
[(list 'erf x) (list ival-erf x)]
50-
[(list 'erfc x) (list ival-erfc x)]
51-
[(list 'exp x) (list ival-exp x)]
52-
[(list 'exp2 x) (list ival-exp2 x)]
53-
[(list 'expm1 x) (list ival-expm1 x)]
48+
[(list 'cosh x) (list ival-cosh! (alloc-outreg!) x)]
49+
[(list 'erf x) (list ival-erf! (alloc-outreg!) x)]
50+
[(list 'erfc x) (list ival-erfc! (alloc-outreg!) x)]
51+
[(list 'exp x) (list ival-exp! (alloc-outreg!) x)]
52+
[(list 'exp2 x) (list ival-exp2! (alloc-outreg!) x)]
53+
[(list 'expm1 x) (list ival-expm1! (alloc-outreg!) x)]
5454
[(list 'fabs x) (list ival-fabs x)]
5555
[(list 'floor x) (list ival-floor x)]
5656
[(list 'lgamma x) (list ival-lgamma x)]
57-
[(list 'log x) (list ival-log x)]
58-
[(list 'log10 x) (list ival-log10 x)]
59-
[(list 'log1p x) (list ival-log1p x)]
60-
[(list 'log2 x) (list ival-log2 x)]
57+
[(list 'log x) (list ival-log! (alloc-outreg!) x)]
58+
[(list 'log10 x) (list ival-log10! (alloc-outreg!) x)]
59+
[(list 'log1p x) (list ival-log1p! (alloc-outreg!) x)]
60+
[(list 'log2 x) (list ival-log2! (alloc-outreg!) x)]
6161
[(list 'logb x) (list ival-logb x)]
62-
[(list 'rint x) (list ival-rint x)]
62+
[(list 'rint x) (list ival-rint! (alloc-outreg!) x)]
6363
[(list 'round x) (list ival-round x)]
6464
[(list 'sin x) (list ival-sin x)]
65-
[(list 'sinh x) (list ival-sinh x)]
66-
[(list 'sqrt x) (list ival-sqrt x)]
65+
[(list 'sinh x) (list ival-sinh! (alloc-outreg!) x)]
66+
[(list 'sqrt x) (list ival-sqrt! (alloc-outreg!) x)]
6767
[(list 'tan x) (list ival-tan x)]
68-
[(list 'tanh x) (list ival-tanh x)]
68+
[(list 'tanh x) (list ival-tanh! (alloc-outreg!) x)]
6969
[(list 'tgamma x) (list ival-tgamma x)]
7070
[(list 'trunc x) (list ival-trunc x)]
7171

ops/all.rkt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,33 @@
2222
ival-sub
2323
ival-sub!
2424
ival-neg
25+
ival-neg!
2526
ival-mult
2627
ival-mult!
2728
ival-div
2829
ival-div!
2930
ival-fma
3031
ival-fabs
3132
ival-sqrt
33+
ival-sqrt!
3234
ival-cbrt
35+
ival-cbrt!
3336
ival-hypot
3437
ival-hypot!
3538
ival-exp
39+
ival-exp!
3640
ival-exp2
41+
ival-exp2!
3742
ival-expm1
43+
ival-expm1!
3844
ival-log
45+
ival-log!
3946
ival-log2
47+
ival-log2!
4048
ival-log10
49+
ival-log10!
4150
ival-log1p
51+
ival-log1p!
4252
ival-logb
4353
ival-pow
4454
ival-pow2
@@ -49,22 +59,34 @@
4959
ival-sinu
5060
ival-tanu
5161
ival-asin
62+
ival-asin!
5263
ival-acos
64+
ival-acos!
5365
ival-atan
66+
ival-atan!
5467
ival-atan2
5568
ival-sinh
69+
ival-sinh!
5670
ival-cosh
71+
ival-cosh!
5772
ival-tanh
73+
ival-tanh!
5874
ival-asinh
75+
ival-asinh!
5976
ival-acosh
77+
ival-acosh!
6078
ival-atanh
79+
ival-atanh!
6180
ival-erf
81+
ival-erf!
6282
ival-erfc
83+
ival-erfc!
6384
ival-lgamma
6485
ival-tgamma
6586
ival-fmod
6687
ival-remainder
6788
ival-rint
89+
ival-rint!
6890
ival-round
6991
ival-ceil
7092
ival-floor

ops/core.rkt

Lines changed: 32 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,9 @@
285285
(define-syntax-rule (define* name expr)
286286
(define name (procedure-rename expr 'name)))
287287

288+
(define ((immutable fn!) x)
289+
(fn! (new-ival (bf-precision)) x))
290+
288291
(define ((monotonic bffn) x)
289292
(match-define (ival lo hi err? err) x)
290293
(ival (rnd 'down epfn bffn lo) (rnd 'up epfn bffn hi) err? err))
@@ -354,8 +357,7 @@
354357
yerr))
355358

356359
(define* ival-neg! (comonotonic-mpfr! mpfr-neg!))
357-
(define (ival-neg x)
358-
(ival-neg! (new-ival (bf-precision)) x))
360+
(define* ival-neg (immutable ival-neg!))
359361

360362
;; This function fixes a bug in MPFR where mixed-precision
361363
;; rint/round/ceil/floor/trunc operations are rounded in the input
@@ -367,8 +369,7 @@
367369
(f x)))
368370

369371
(define* ival-rint! (monotonic-mpfr! mpfr-rint!))
370-
(define (ival-rint x)
371-
(ival-rint! (new-ival (bf-precision)) x))
372+
(define* ival-rint (immutable ival-rint!))
372373
(define* ival-round (monotonic (fix-rounding bfround)))
373374
(define* ival-ceil (monotonic (fix-rounding bfceiling)))
374375
(define* ival-floor (monotonic (fix-rounding bffloor)))
@@ -406,43 +407,32 @@
406407
(define (ival-exp! out x)
407408
(define y ((monotonic-mpfr! mpfr-exp!) out x))
408409
((overflows-loose-at (bfneg exp-overflow-threshold) exp-overflow-threshold) x y))
409-
410-
(define (ival-exp x)
411-
(ival-exp! (new-ival (bf-precision)) x))
410+
(define* ival-exp (immutable ival-exp!))
412411

413412
(define*
414413
ival-expm1!
415414
(overflows-at! (monotonic-mpfr! mpfr-expm1!) (bfneg exp-overflow-threshold) exp-overflow-threshold))
416-
(define (ival-expm1 x)
417-
(ival-expm1! (new-ival (bf-precision)) x))
415+
(define* ival-expm1 (immutable ival-expm1!))
418416

419417
(define (ival-exp2! out x)
420418
(define y ((monotonic-mpfr! mpfr-exp2!) out x))
421419
((overflows-loose-at (bfneg exp2-overflow-threshold) exp2-overflow-threshold) x y))
422-
423-
(define (ival-exp2 x)
424-
(ival-exp2! (new-ival (bf-precision)) x))
420+
(define* ival-exp2 (immutable ival-exp2!))
425421

426422
(define* ival-log! (clamp-strict! (monotonic-mpfr! mpfr-log!) 0.bf +inf.bf))
427-
(define (ival-log x)
428-
(ival-log! (new-ival (bf-precision)) x))
423+
(define* ival-log (immutable ival-log!))
429424
(define* ival-log2! (clamp-strict! (monotonic-mpfr! mpfr-log2!) 0.bf +inf.bf))
430-
(define (ival-log2 x)
431-
(ival-log2! (new-ival (bf-precision)) x))
425+
(define* ival-log2 (immutable ival-log2!))
432426
(define* ival-log10! (clamp-strict! (monotonic-mpfr! mpfr-log10!) 0.bf +inf.bf))
433-
(define (ival-log10 x)
434-
(ival-log10! (new-ival (bf-precision)) x))
427+
(define* ival-log10 (immutable ival-log10!))
435428
(define* ival-log1p! (clamp-strict! (monotonic-mpfr! mpfr-log1p!) -1.bf +inf.bf))
436-
(define (ival-log1p x)
437-
(ival-log1p! (new-ival (bf-precision)) x))
429+
(define* ival-log1p (immutable ival-log1p!))
438430
[define* ival-logb (compose ival-floor ival-log2 ival-exact-fabs)]
439431

440432
(define* ival-sqrt! (clamp! (monotonic-mpfr! mpfr-sqrt!) 0.bf +inf.bf))
441-
(define (ival-sqrt x)
442-
(ival-sqrt! (new-ival (bf-precision)) x))
433+
(define* ival-sqrt (immutable ival-sqrt!))
443434
(define* ival-cbrt! (monotonic-mpfr! mpfr-cbrt!))
444-
(define (ival-cbrt x)
445-
(ival-cbrt! (new-ival (bf-precision)) x))
435+
(define* ival-cbrt (immutable ival-cbrt!))
446436

447437
(define (ival-and . as)
448438
(ival (endpoint (andmap ival-lo-val as) (andmap (compose endpoint-immovable? ival-lo) as))
@@ -460,15 +450,12 @@
460450
(ival (epfn not (ival-hi x)) (epfn not (ival-lo x)) (ival-err? x) (ival-err x)))
461451

462452
(define* ival-asin! (clamp! (monotonic-mpfr! mpfr-asin!) -1.bf 1.bf))
463-
(define (ival-asin x)
464-
(ival-asin! (new-ival (bf-precision)) x))
453+
(define* ival-asin (immutable ival-asin!))
465454
(define* ival-acos! (clamp! (comonotonic-mpfr! mpfr-acos!) -1.bf 1.bf))
466-
(define (ival-acos x)
467-
(ival-acos! (new-ival (bf-precision)) x))
455+
(define* ival-acos (immutable ival-acos!))
468456

469457
(define* ival-atan! (monotonic-mpfr! mpfr-atan!))
470-
(define (ival-atan x)
471-
(ival-atan! (new-ival (bf-precision)) x))
458+
(define* ival-atan (immutable ival-atan!))
472459

473460
(define (ival-atan2 y x)
474461
(match-define (ival xlo xhi xerr? xerr) x)
@@ -503,39 +490,33 @@
503490
(define*
504491
ival-sinh!
505492
(overflows-at! (monotonic-mpfr! mpfr-sinh!) (bfneg sinh-overflow-threshold) sinh-overflow-threshold))
506-
(define (ival-sinh x)
507-
(ival-sinh! (new-ival (bf-precision)) x))
493+
(define* ival-sinh (immutable ival-sinh!))
508494

509-
(define* ival-cosh!
510-
(compose (overflows-at! (monotonic-mpfr! mpfr-cosh!)
511-
(bfneg acosh-overflow-threshold)
512-
acosh-overflow-threshold)
513-
ival-exact-fabs))
514-
(define (ival-cosh x)
515-
(ival-cosh! (new-ival (bf-precision)) x))
495+
(define (ival-cosh! out x)
496+
(define absx (ival-exact-fabs x))
497+
((overflows-at! (monotonic-mpfr! mpfr-cosh!)
498+
(bfneg acosh-overflow-threshold)
499+
acosh-overflow-threshold)
500+
out
501+
absx))
502+
(define* ival-cosh (immutable ival-cosh!))
516503

517504
(define* ival-tanh! (monotonic-mpfr! mpfr-tanh!))
518-
(define (ival-tanh x)
519-
(ival-tanh! (new-ival (bf-precision)) x))
505+
(define* ival-tanh (immutable ival-tanh!))
520506

521507
(define* ival-asinh! (monotonic-mpfr! mpfr-asinh!))
522-
(define (ival-asinh x)
523-
(ival-asinh! (new-ival (bf-precision)) x))
508+
(define* ival-asinh (immutable ival-asinh!))
524509

525510
(define* ival-acosh! (clamp! (monotonic-mpfr! mpfr-acosh!) 1.bf +inf.bf))
526-
(define (ival-acosh x)
527-
(ival-acosh! (new-ival (bf-precision)) x))
511+
(define* ival-acosh (immutable ival-acosh!))
528512
(define* ival-atanh! (clamp-strict! (monotonic-mpfr! mpfr-atanh!) -1.bf 1.bf))
529-
(define (ival-atanh x)
530-
(ival-atanh! (new-ival (bf-precision)) x))
513+
(define* ival-atanh (immutable ival-atanh!))
531514

532515
(define* ival-erf! (monotonic-mpfr! mpfr-erf!))
533-
(define (ival-erf x)
534-
(ival-erf! (new-ival (bf-precision)) x))
516+
(define* ival-erf (immutable ival-erf!))
535517

536518
(define* ival-erfc! (comonotonic-mpfr! mpfr-erfc!))
537-
(define (ival-erfc x)
538-
(ival-erfc! (new-ival (bf-precision)) x))
519+
(define* ival-erfc (immutable ival-erfc!))
539520

540521
(define (ival-cmp x y)
541522
(define can-< (epfn bflt? (ival-lo x) (ival-hi y)))

0 commit comments

Comments
 (0)