cljs.math/ulp

functionsince v1.11.50Edit
(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-
Source code @ clojurescript:src/main/cljs/cljs/math.cljs
(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))