|
279 | 279 |
|
280 | 280 | ;;;;;;;;;;;;;;;;;;; Variadic operators ;;;;;;;;;;;;;;;; |
281 | 281 |
|
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))])) |
318 | 311 |
|
319 | 312 | (define (gfl+ . args) |
320 | 313 | (define sig (- (gfl-bits) (gfl-exponent))) |
321 | 314 | (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))) |
324 | 318 |
|
325 | 319 | (define (gfl- head . rest) |
326 | 320 | (define sig (- (gfl-bits) (gfl-exponent))) |
327 | 321 | (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))) |
330 | 325 |
|
331 | 326 | (define (gfl* . args) |
332 | 327 | (define sig (- (gfl-bits) (gfl-exponent))) |
333 | 328 | (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))) |
336 | 332 |
|
337 | 333 | (define (gfl/ head . rest) |
338 | 334 | (define sig (- (gfl-bits) (gfl-exponent))) |
339 | 335 | (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))) |
342 | 339 |
|
343 | 340 | (define (gflmax2 x y) |
344 | 341 | (cond |
|
0 commit comments