
additions/changes * More accurate `flulp-error' * Added `flonum->fields', `fields->flonum', `flonum->sig+exp', `sig+exp->flonum' (currently undocumented) * Correctly rounded, robust `bigfloat->fl2' and `fl2' * Correctly rounded, robust `fl+/error', `fl-/error', `fl*/error', `flsqr/error', `fl//error' * Much faster but slightly less accurate fl2 ops (shamelessly stolen from crlibm, which is LGPL) * Added `fl2ulp', `fl2ulp-error', `fl2?' (which detects overlap), `+max-fl2-subnormal.0' (which was tricky), `fl2abs' * Added deterministic and randomized flonum op tests (against MPFR) * Added deterministic and randomized flonum/error op tests (against MPFR) * Added deterministic and randomized fl2 op tests (against MPFR) * Exposed FPU tests in `math/utils' (currently undocumented)
23 lines
687 B
Racket
23 lines
687 B
Racket
#lang racket/base
|
|
|
|
(provide near-pow2
|
|
near-pow2/div)
|
|
|
|
(module untyped-defs racket/base
|
|
(require racket/flonum)
|
|
|
|
(provide (all-defined-out))
|
|
|
|
(define-syntax-rule (near-pow2 a)
|
|
(flexpt 2.0 (flmax -511.0 (flmin 511.0 (flround (fl/ (fllog (flabs a)) (fllog 2.0)))))))
|
|
|
|
(define-syntax-rule (near-pow2/div a b)
|
|
;; Clamping both values makes this work properly when a or b is infinite or zero
|
|
(let ([ea (flmax -511.0 (flmin 511.0 (fl/ (fllog (flabs a)) (fllog 2.0))))]
|
|
[eb (flmax -511.0 (flmin 511.0 (fl/ (fllog (flabs b)) (fllog 2.0))))])
|
|
(flexpt 2.0 (flround (fl* 0.5 (fl+ ea eb))))))
|
|
|
|
) ; module
|
|
|
|
(require (submod "." untyped-defs))
|