Skip to content

Commit 030949d

Browse files
authored
Merge pull request #130 from herbie-fp/direct-rounding-core-ops
Direct rounding for core operators
2 parents 2f9ad31 + bcda3ea commit 030949d

File tree

5 files changed

+224
-60
lines changed

5 files changed

+224
-60
lines changed

eval/compile.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
[(list '- x y) (list ival-sub! (alloc-outreg!) x y)]
7474
[(list '* x y) (list ival-mult! (alloc-outreg!) x y)]
7575
[(list '/ x y) (list ival-div! (alloc-outreg!) x y)]
76+
[(list 'hypot x y) (list ival-hypot! (alloc-outreg!) x y)]
7677
#;[(list '+ x y) (list ival-add x y)]
7778
#;[(list '- x y) (list ival-sub x y)]
7879
#;[(list '* x y) (list ival-mult x y)]

mpfr.rkt

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,82 @@
5959
(define mpfr-remainder!
6060
(get-mpfr-fun 'mpfr_remainder (_fun _mpfr-pointer _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
6161

62-
;(define mpfr-set-prec! (get-mpfr-fun 'mpfr_set_prec (_fun _mpfr-pointer _prec_t -> _void)))
62+
(define mpfr-hypot!
63+
(get-mpfr-fun 'mpfr_hypot (_fun _mpfr-pointer _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
64+
65+
(define mpfr-pow!
66+
(get-mpfr-fun 'mpfr_pow (_fun _mpfr-pointer _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
67+
68+
(define mpfr-log! (get-mpfr-fun 'mpfr_log (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
69+
70+
(define mpfr-exp! (get-mpfr-fun 'mpfr_exp (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
71+
72+
(define mpfr-expm1! (get-mpfr-fun 'mpfr_expm1 (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
73+
74+
(define mpfr-sqrt! (get-mpfr-fun 'mpfr_sqrt (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
75+
76+
(define mpfr-sin! (get-mpfr-fun 'mpfr_sin (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
77+
78+
(define mpfr-cos! (get-mpfr-fun 'mpfr_cos (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
79+
80+
(define mpfr-tan! (get-mpfr-fun 'mpfr_tan (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
81+
82+
(define mpfr-cbrt! (get-mpfr-fun 'mpfr_cbrt (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
83+
84+
(define mpfr-neg! (get-mpfr-fun 'mpfr_neg (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
85+
86+
(define mpfr-abs! (get-mpfr-fun 'mpfr_abs (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
87+
88+
(define mpfr-asin! (get-mpfr-fun 'mpfr_asin (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
89+
90+
(define mpfr-acos! (get-mpfr-fun 'mpfr_acos (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
91+
92+
(define mpfr-atan! (get-mpfr-fun 'mpfr_atan (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
93+
94+
(define mpfr-sinh! (get-mpfr-fun 'mpfr_sinh (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
95+
96+
(define mpfr-tanh! (get-mpfr-fun 'mpfr_tanh (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
97+
98+
(define mpfr-asinh! (get-mpfr-fun 'mpfr_asinh (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
99+
100+
(define mpfr-acosh! (get-mpfr-fun 'mpfr_acosh (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
101+
102+
(define mpfr-atanh! (get-mpfr-fun 'mpfr_atanh (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
103+
104+
(define mpfr-erf! (get-mpfr-fun 'mpfr_erf (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
105+
106+
(define mpfr-erfc! (get-mpfr-fun 'mpfr_erfc (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
107+
108+
(define mpfr-log2! (get-mpfr-fun 'mpfr_log2 (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
109+
110+
(define mpfr-log10! (get-mpfr-fun 'mpfr_log10 (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
111+
112+
(define mpfr-log1p! (get-mpfr-fun 'mpfr_log1p (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
113+
114+
(define mpfr-exp2! (get-mpfr-fun 'mpfr_exp2 (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
115+
116+
(define mpfr-rint! (get-mpfr-fun 'mpfr_rint (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
117+
118+
(define mpfr-round! (get-mpfr-fun 'mpfr_round (_fun _mpfr-pointer _mpfr-pointer -> _int)))
119+
120+
(define mpfr-ceil! (get-mpfr-fun 'mpfr_ceil (_fun _mpfr-pointer _mpfr-pointer -> _int)))
121+
122+
(define mpfr-floor! (get-mpfr-fun 'mpfr_floor (_fun _mpfr-pointer _mpfr-pointer -> _int)))
123+
124+
(define mpfr-trunc! (get-mpfr-fun 'mpfr_trunc (_fun _mpfr-pointer _mpfr-pointer -> _int)))
125+
126+
(define mpfr-min!
127+
(get-mpfr-fun 'mpfr_min (_fun _mpfr-pointer _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
128+
129+
(define mpfr-max!
130+
(get-mpfr-fun 'mpfr_max (_fun _mpfr-pointer _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
131+
132+
(define mpfr-cosh! (get-mpfr-fun 'mpfr_cosh (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
133+
134+
(define mpfr-const-pi! (get-mpfr-fun 'mpfr_const_pi (_fun _mpfr-pointer _rnd_t -> _int)))
135+
136+
(define mpfr-atan2!
137+
(get-mpfr-fun 'mpfr_atan2 (_fun _mpfr-pointer _mpfr-pointer _mpfr-pointer _rnd_t -> _int)))
63138

64139
(define mpfr-set! (get-mpfr-fun 'mpfr_set (_fun _mpfr-pointer _mpfr-pointer _rnd_t -> _void)))
65140

@@ -227,5 +302,44 @@
227302
mpfr-sub!
228303
mpfr-mul!
229304
mpfr-div!
305+
mpfr-hypot!
306+
mpfr-pow!
307+
mpfr-exp!
308+
mpfr-expm1!
309+
mpfr-sqrt!
310+
mpfr-sin!
311+
mpfr-cos!
312+
mpfr-tan!
313+
mpfr-cosu!
314+
mpfr-sinu!
315+
mpfr-tanu!
316+
mpfr-cbrt!
317+
mpfr-neg!
318+
mpfr-abs!
319+
mpfr-asin!
320+
mpfr-acos!
321+
mpfr-atan!
322+
mpfr-sinh!
323+
mpfr-cosh!
324+
mpfr-tanh!
325+
mpfr-asinh!
326+
mpfr-acosh!
327+
mpfr-atanh!
328+
mpfr-erf!
329+
mpfr-erfc!
330+
mpfr-log2!
331+
mpfr-log10!
332+
mpfr-log1p!
333+
mpfr-exp2!
334+
mpfr-rint!
335+
mpfr-round!
336+
mpfr-ceil!
337+
mpfr-floor!
338+
mpfr-trunc!
339+
mpfr-min!
340+
mpfr-max!
341+
mpfr-log!
342+
mpfr-const-pi!
343+
mpfr-atan2!
230344
mpfr-set-prec!
231345
mpfr-set!)

ops/all.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
ival-sqrt
3232
ival-cbrt
3333
ival-hypot
34+
ival-hypot!
3435
ival-exp
3536
ival-exp2
3637
ival-expm1

ops/arith.rkt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
ival-div
1313
ival-fma
1414
ival-fdim
15+
ival-hypot!
1516
ival-hypot)
1617

1718
;; Endpoint computation for both `add`, `sub`, and `hypot` (which has an add inside)
@@ -46,7 +47,7 @@
4647
(define (ival-sub x y)
4748
(ival-sub! (new-ival (bf-precision)) x y))
4849

49-
(define (epmul! out a-endpoint b-endpoint a-class b-class)
50+
(define (epmul! out a-endpoint b-endpoint a-class b-class rnd)
5051
(match-define (endpoint a a!) a-endpoint)
5152
(match-define (endpoint b b!) b-endpoint)
5253
(define a0 (bfzero? a))
@@ -57,7 +58,7 @@
5758
[(or a0 b0)
5859
(mpfr-set! out 0.bf 'nearest)
5960
#t]
60-
[else (= 0 (mpfr-mul! out a b (bf-rounding-mode)))]))
61+
[else (= 0 (mpfr-mul! out a b rnd))]))
6162
(endpoint out
6263
(or (and a! b! exact?)
6364
(and a! a0)
@@ -77,8 +78,8 @@
7778

7879
(define (mkmult out a b c d)
7980
(match-define (ival (endpoint rlo _) (endpoint rhi _) _ _) out)
80-
(ival (rnd 'down epmul! rlo a b x-sign y-sign)
81-
(rnd 'up epmul! rhi c d x-sign y-sign)
81+
(ival (epmul! rlo a b x-sign y-sign 'down)
82+
(epmul! rhi c d x-sign y-sign 'up)
8283
(or xerr? yerr?)
8384
(or xerr yerr)))
8485

@@ -106,11 +107,11 @@
106107
(mpfr-set! (ival-hi-val out) hi 'up) ; should be exact
107108
(ival (endpoint (ival-lo-val out) lo!) (endpoint (ival-hi-val out) hi!) err? err)]))
108109

109-
(define (epdiv! out a-endpoint b-endpoint a-class)
110+
(define (epdiv! out a-endpoint b-endpoint a-class rnd)
110111
(match-define (endpoint a a!) a-endpoint)
111112
(match-define (endpoint b b!) b-endpoint)
112113
(mpfr-set-prec! out (bf-precision))
113-
(define exact? (= 0 (mpfr-div! out a b (bf-rounding-mode))))
114+
(define exact? (= 0 (mpfr-div! out a b rnd)))
114115
(endpoint out
115116
(or (and a! b! exact?)
116117
(and a! (bfzero? a))
@@ -128,7 +129,7 @@
128129
(define y-class (classify-ival-strict y))
129130

130131
(define (mkdiv a b c d)
131-
(ival (rnd 'down epdiv! rlo a b x-class) (rnd 'up epdiv! rhi c d x-class) err? err))
132+
(ival (epdiv! rlo a b x-class 'down) (epdiv! rhi c d x-class 'up) err? err))
132133

133134
(match* (x-class y-class)
134135
[(_ 0) ; In this case, y stradles 0
@@ -157,12 +158,15 @@
157158
(define (ival-fdim x y)
158159
(ival-fmax (ival-sub x y) (mk-ival 0.bf)))
159160

160-
(define (ival-hypot x y)
161+
(define (ival-hypot! out x y)
161162
(define err? (or (ival-err? x) (ival-err? y)))
162163
(define err (or (ival-err x) (ival-err y)))
163164
(define x* (ival-exact-fabs x))
164165
(define y* (ival-exact-fabs y))
165-
(ival (rnd 'down eplinear bfhypot (ival-lo x*) (ival-lo y*))
166-
(rnd 'up eplinear bfhypot (ival-hi x*) (ival-hi 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)
167168
err?
168169
err))
170+
171+
(define (ival-hypot x y)
172+
(ival-hypot! (new-ival (bf-precision)) x y))

0 commit comments

Comments
 (0)