cljs.math/ulp
function | since v1.11.50 | Edit |
(ulp d)
Source docstring:
Returns the size of an ulp (unit in last place) for d.
If d is ##NaN => ##NaN
If d is ##Inf or ##-Inf => ##Inf
If d is zero => Number/MIN_VALUE
If d is +/- Number/MAX_VALUE => 2^971
See: https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#ulp-double-
(defn ^number ulp
{:added "1.11.10"}
[d]
(cond
^boolean (js/isNaN d) d
^boolean (js/isFinite d)
(let [e (get-exponent d)]
(case e
1024 (Math/abs d) ;; EXP-MAX + 1
-1023 js/Number.MIN_VALUE ;; EXP-MIN - 1
(let [e (- e (+ 31 SIGNIFICAND-WIDTH32))] ;; SIGNIFICAND_WIDTH64 -1
(if (>= e EXP-MIN)
(power-of-two e)
(let [shift (- e (- EXP-MIN 31 SIGNIFICAND-WIDTH32))]
(if (< shift 32)
(hi-lo->double 0 (bit-shift-left 1 shift))
(hi-lo->double (bit-shift-left 1 (- shift 32)) 0)))))))
:default ##Inf))