@lvlte/ulp 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,12 +12,10 @@ export declare const FLOAT64_MIN: number;
12
12
  */
13
13
  export declare function eps(x?: number): number;
14
14
  /**
15
- * Exponent of a normalized floating-point number x (`Math.log2()` not precise
16
- * enough for large numbers).
17
- *
18
- * NB. This function assumes `x` is a finite, strictly positive number.
15
+ * Exponent of a normalized floating-point number x.
19
16
  *
20
17
  * @param x The input number
21
- * @returns The largest integer `y` such that `2^y ≤ x`.
18
+ * @returns The largest integer `y` such that `2^y ≤ |x|`, or `NaN` if x is not
19
+ * a finite number / if x is ±0.
22
20
  */
23
21
  export declare function exponent(x: number): number;
package/dist/cjs/index.js CHANGED
@@ -11,11 +11,17 @@ function eps(x = 1) {
11
11
  if (x <= exports.FLOAT64_MIN) {
12
12
  return Number.MIN_VALUE;
13
13
  }
14
- return Math.pow(2, (exponent(x) - 52));
14
+ return Math.pow(2, (_exponent(x) - 52));
15
15
  }
16
16
  return NaN;
17
17
  }
18
18
  function exponent(x) {
19
+ if (Number.isFinite(x) && x !== 0) {
20
+ return _exponent(Math.abs(x));
21
+ }
22
+ return NaN;
23
+ }
24
+ function _exponent(x) {
19
25
  const [ipart, fpart] = (0, modf_1.modf)(x);
20
26
  if (ipart > 0) {
21
27
  return ipart.toString(2).split('.', 1)[0].length - 1;
package/dist/index.d.ts CHANGED
@@ -12,12 +12,10 @@ export declare const FLOAT64_MIN: number;
12
12
  */
13
13
  export declare function eps(x?: number): number;
14
14
  /**
15
- * Exponent of a normalized floating-point number x (`Math.log2()` not precise
16
- * enough for large numbers).
17
- *
18
- * NB. This function assumes `x` is a finite, strictly positive number.
15
+ * Exponent of a normalized floating-point number x.
19
16
  *
20
17
  * @param x The input number
21
- * @returns The largest integer `y` such that `2^y ≤ x`.
18
+ * @returns The largest integer `y` such that `2^y ≤ |x|`, or `NaN` if x is not
19
+ * a finite number / if x is ±0.
22
20
  */
23
21
  export declare function exponent(x: number): number;
package/dist/index.js CHANGED
@@ -6,11 +6,17 @@ export function eps(x = 1) {
6
6
  if (x <= FLOAT64_MIN) {
7
7
  return Number.MIN_VALUE;
8
8
  }
9
- return Math.pow(2, (exponent(x) - 52));
9
+ return Math.pow(2, (_exponent(x) - 52));
10
10
  }
11
11
  return NaN;
12
12
  }
13
13
  export function exponent(x) {
14
+ if (Number.isFinite(x) && x !== 0) {
15
+ return _exponent(Math.abs(x));
16
+ }
17
+ return NaN;
18
+ }
19
+ function _exponent(x) {
14
20
  const [ipart, fpart] = modf(x);
15
21
  if (ipart > 0) {
16
22
  return ipart.toString(2).split('.', 1)[0].length - 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvlte/ulp",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Compute the unit in last place of a given IEEE-754 64-bit number",
5
5
  "license": "MIT",
6
6
  "author": "Eric Lavault <lvlte.code@gmail.com>",