Skip to content

Commit a25242c

Browse files
committed
fix precision issues
1 parent a3edb54 commit a25242c

File tree

1 file changed

+41
-44
lines changed

1 file changed

+41
-44
lines changed

private/gfl.rkt

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -279,66 +279,63 @@
279279

280280
;;;;;;;;;;;;;;;;;;; Variadic operators ;;;;;;;;;;;;;;;;
281281

282-
(define (mpfrv+ emin emax sig . xs)
283-
(cond
284-
[(null? xs) 0.bf]
285-
[else
286-
(define xs1 (cdr xs))
287-
(cond
288-
[(null? xs1) (car xs)]
289-
[else
290-
(define xs2 (cdr xs1))
291-
(cond
292-
[(null? xs2) ((mpfr-eval emin emax sig) mpfr-add (car xs) (car xs1))]
293-
[else ((mpfr-eval emin emax sig) mpfr-sum xs)])])]))
294-
295-
(define (mpfrv- emin emax sig x . xs)
296-
(cond
297-
[(null? xs) (mpfr-neg x)]
298-
[(null? (cdr xs)) ((mpfr-eval emin emax sig) mpfr-sub x (car xs))]
299-
[else (mpfr-neg (apply mpfrv+ emin emax sig (mpfr-neg x) xs))]))
300-
301-
(define (mpfrv* emin emax sig . xs)
302-
(cond
303-
[(null? xs) 1.bf]
304-
[else
305-
(let loop ([x (car xs)] [xs (cdr xs)])
306-
(cond
307-
[(null? xs) x]
308-
[else (loop ((mpfr-eval emin emax sig) mpfr-mul x (car xs)) (cdr xs))]))]))
309-
310-
(define (mpfrv/ emin emax sig x . xs)
311-
(cond
312-
[(null? xs) ((mpfr-eval emin emax sig) mpfr-div 1.bf x)]
313-
[else
314-
(let loop ([x x] [xs xs])
315-
(cond
316-
[(null? xs) x]
317-
[else (loop ((mpfr-eval emin emax sig) mpfr-div x (car xs)) (cdr xs))]))]))
282+
(define (mpfrv+ . xs)
283+
(match xs
284+
[(list) 0.bf]
285+
[(list x) (bfcopy x)]
286+
[(list x y rest ...)
287+
(for/fold ([sum (mpfr-add x y)]) ([z (in-list rest)])
288+
(mpfr-add sum z))]))
289+
290+
(define (mpfrv- x . xs)
291+
(match xs
292+
[(list) (mpfr-neg x)]
293+
[(list y rest ...)
294+
(for/fold ([diff (mpfr-sub x y)]) ([z (in-list rest)])
295+
(mpfr-sub diff z))]))
296+
297+
(define (mpfrv* . xs)
298+
(match xs
299+
[(list) 1.bf]
300+
[(list x) (bfcopy x)]
301+
[(list x y rest ...)
302+
(for/fold ([sum (mpfr-mul x y)]) ([z (in-list rest)])
303+
(mpfr-mul sum z))]))
304+
305+
(define (mpfrv/ x . xs)
306+
(match xs
307+
[(list) (mpfr-div 1.bf x)]
308+
[(list y rest ...)
309+
(for/fold ([quo (mpfr-div x y)]) ([z (in-list rest)])
310+
(mpfr-div quo z))]))
318311

319312
(define (gfl+ . args)
320313
(define sig (- (gfl-bits) (gfl-exponent)))
321314
(define-values (emin emax) (ex->ebounds (gfl-exponent) sig))
322-
(gflonum (apply mpfrv+ emin emax sig (map gflonum-val args))
323-
(gfl-exponent) (gfl-bits)))
315+
(gflonum (apply (mpfr-eval emin emax sig) mpfrv+ (map gflonum-val args))
316+
(gfl-exponent)
317+
(gfl-bits)))
324318

325319
(define (gfl- head . rest)
326320
(define sig (- (gfl-bits) (gfl-exponent)))
327321
(define-values (emin emax) (ex->ebounds (gfl-exponent) sig))
328-
(gflonum (apply mpfrv- emin emax sig (gflonum-val head) (map gflonum-val rest))
329-
(gfl-exponent) (gfl-bits)))
322+
(gflonum (apply (mpfr-eval emin emax sig) mpfrv- (gflonum-val head) (map gflonum-val rest))
323+
(gfl-exponent)
324+
(gfl-bits)))
330325

331326
(define (gfl* . args)
332327
(define sig (- (gfl-bits) (gfl-exponent)))
333328
(define-values (emin emax) (ex->ebounds (gfl-exponent) sig))
334-
(gflonum (apply mpfrv* emin emax sig (map gflonum-val args))
335-
(gfl-exponent) (gfl-bits)))
329+
(gflonum (apply (mpfr-eval emin emax sig) mpfrv* (map gflonum-val args))
330+
(gfl-exponent)
331+
(gfl-bits)))
336332

337333
(define (gfl/ head . rest)
338334
(define sig (- (gfl-bits) (gfl-exponent)))
339335
(define-values (emin emax) (ex->ebounds (gfl-exponent) sig))
340-
(gflonum (apply mpfrv/ emin emax sig (gflonum-val head) (map gflonum-val rest))
341-
(gfl-exponent) (gfl-bits)))
336+
(gflonum (apply (mpfr-eval emin emax sig) mpfrv/ (gflonum-val head) (map gflonum-val rest))
337+
(gfl-exponent)
338+
(gfl-bits)))
342339

343340
(define (gflmax2 x y)
344341
(cond

0 commit comments

Comments
 (0)