not-so-float 1.0.2 → 1.2.0

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.
package/README.md CHANGED
@@ -2,11 +2,16 @@
2
2
 
3
3
  ![NPM Version](https://img.shields.io/npm/v/not-so-float)
4
4
  ![NPM License](https://img.shields.io/npm/l/not-so-float)
5
-
5
+ ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/victorpoughon/not-so-float/node.js.yml)
6
6
 
7
7
  **Not So Float** is a pure TypeScript library that implements **Interval Union
8
8
  Arithmetic** over IEEE 754 double precision floats (JS numbers).
9
9
 
10
+ > [!TIP]
11
+ > Try [the interval
12
+ > calculator](https://victorpoughon.github.io/interval-calculator/) for an
13
+ > interactive demo of interval union arithmetic.
14
+
10
15
  ```typescript
11
16
  import * as nsf from "not-so-float";
12
17
 
@@ -32,6 +37,7 @@ Design goals:
32
37
  - Functional (stateless) API
33
38
  - Strong focus on simplicity and clarity of implementation
34
39
  - No signed zero convention, `-0 === 0` should still be true in the context of interval bounds
40
+ - Interval bounds are always inclusive
35
41
  - No empty interval, but empty unions
36
42
  - Support division by intervals containing zero without compromise
37
43
 
@@ -46,6 +52,12 @@ Design goals:
46
52
  npm install not-so-float
47
53
  ```
48
54
 
55
+ Import the library with:
56
+
57
+ ```javascript
58
+ import * as nsf from "not-so-float";
59
+ ```
60
+
49
61
  ## Outward Rounding
50
62
 
51
63
  The main interest of interval arithmetic is the inclusion property. Any interval
@@ -146,6 +158,11 @@ Union class member functions:
146
158
 
147
159
  ```typescript
148
160
  class Union {
161
+ isEmpty(): boolean;
162
+ isFull(): boolean;
163
+ lower(): number;
164
+ upper(): number;
165
+ contains(value: number): boolean;
149
166
  forEach(callback: (x: Interval, index: number) => void): void;
150
167
  toString(numbers?: (x: number) => string): string;
151
168
  print(): void;
@@ -162,13 +179,16 @@ For example:
162
179
  [ Interval { lo: 1, hi: 2 }, Interval { lo: 4, hi: 6 } ]
163
180
  ```
164
181
 
165
- ## Compare
182
+ ## Set theory
166
183
 
167
- Compare intervals and unions with the following utility functions:
184
+ Compare and compute intervals and unions with the following implementations of
185
+ set theory operations:
168
186
 
169
187
  ```typescript
170
188
  function overlap(A: Interval | Union, B: Interval | Union): boolean;
171
189
  function disjoint(A: Interval | Union, B: Interval | Union): boolean;
190
+ function intersection(A: Interval | Union, B: Interval | Union): Union;
191
+ function complement(A: Union | Interval): Union;
172
192
  ```
173
193
 
174
194
  ## Arithmetic
@@ -197,15 +217,16 @@ function disjoint(A: Interval | Union, B: Interval | Union): boolean;
197
217
 
198
218
  <div align="center">
199
219
 
200
- | Operation | API function |
201
- | ----------------: | :------------ |
202
- | Absolute value | `nsf.abs(A)` |
203
- | Natural logarithm | `nsf.log(A)` |
204
- | Exponential | `nsf.exp(A)` |
205
- | Square root | `nsf.sqrt(A)` |
206
- | Cosine | `nsf.cos(A)` |
207
- | Sine | `nsf.sin(A)` |
208
- | Tangent | `nsf.tan(A)` |
220
+ | Operation | API function |
221
+ | ----------------: | :------------- |
222
+ | Absolute value | `nsf.abs(A)` |
223
+ | Natural logarithm | `nsf.log(A)` |
224
+ | Exponential | `nsf.exp(A)` |
225
+ | Square root | `nsf.sqrt(A)` |
226
+ | Inverse square | `nsf.sqinv(A)` |
227
+ | Cosine | `nsf.cos(A)` |
228
+ | Sine | `nsf.sin(A)` |
229
+ | Tangent | `nsf.tan(A)` |
209
230
 
210
231
  </div>
211
232
 
@@ -222,4 +243,6 @@ function disjoint(A: Interval | Union, B: Interval | Union): boolean;
222
243
 
223
244
  ## Future improvements
224
245
 
225
- * Support multiple rounding modes
246
+ - Support multiple rounding modes
247
+ - Add shortcut function for `nsf.union(nsf.inter([x]))`
248
+ - Change FULL constant to Union
package/dist/index.cjs CHANGED
@@ -27,6 +27,7 @@ __export(index_exports, {
27
27
  abs: () => abs,
28
28
  add: () => add,
29
29
  bounded: () => bounded,
30
+ complement: () => complement,
30
31
  cos: () => cos,
31
32
  defaultNumbers: () => defaultNumbers,
32
33
  disjoint: () => disjoint,
@@ -39,12 +40,14 @@ __export(index_exports, {
39
40
  idisjoint: () => idisjoint,
40
41
  idiv: () => idiv,
41
42
  iexp: () => iexp,
43
+ iintersection: () => iintersection,
42
44
  ilog: () => ilog,
43
45
  imax: () => imax,
44
46
  imin: () => imin,
45
47
  imul: () => imul,
46
48
  ineg: () => ineg,
47
49
  inter: () => inter,
50
+ intersection: () => intersection,
48
51
  interval: () => interval,
49
52
  intervalType: () => intervalType,
50
53
  ioverlap: () => ioverlap,
@@ -73,6 +76,7 @@ __export(index_exports, {
73
76
  prev: () => prev,
74
77
  rightMul: () => rightMul,
75
78
  sin: () => sin,
79
+ sqinv: () => sqinv,
76
80
  sqrt: () => sqrt,
77
81
  sub: () => sub,
78
82
  tan: () => tan,
@@ -82,9 +86,11 @@ __export(index_exports, {
82
86
  typeCheckIsUnion: () => typeCheckIsUnion,
83
87
  uabs: () => uabs,
84
88
  uadd: () => uadd,
89
+ ucomplement: () => ucomplement,
85
90
  ucos: () => ucos,
86
91
  udiv: () => udiv,
87
92
  uexp: () => uexp,
93
+ uintersection: () => uintersection,
88
94
  ulog: () => ulog,
89
95
  umax: () => umax,
90
96
  umin: () => umin,
@@ -94,6 +100,7 @@ __export(index_exports, {
94
100
  upow: () => upow,
95
101
  upowInt: () => upowInt,
96
102
  usin: () => usin,
103
+ usqinv: () => usqinv,
97
104
  usqrt: () => usqrt,
98
105
  usub: () => usub,
99
106
  utan: () => utan,
@@ -206,6 +213,9 @@ var Union = class {
206
213
  isEmpty() {
207
214
  return this.intervals.length === 0;
208
215
  }
216
+ isFull() {
217
+ return this.intervals.length === 1 && this.intervals[0].lo === -Infinity && this.intervals[0].hi === Infinity;
218
+ }
209
219
  lower() {
210
220
  if (this.isEmpty()) return Infinity;
211
221
  return this.intervals[0].lo;
@@ -307,7 +317,7 @@ var EMPTY = new Union([]);
307
317
 
308
318
  // src/compare.ts
309
319
  function ioverlap(a, b) {
310
- return a.lo <= b.lo && b.lo <= a.hi || b.lo <= a.lo && a.lo <= b.hi;
320
+ return a.hi >= b.lo && a.lo <= b.hi;
311
321
  }
312
322
  function idisjoint(a, b) {
313
323
  return a.hi < b.lo || a.lo > b.hi;
@@ -330,6 +340,52 @@ function disjoint(A, B) {
330
340
  const Bunion = toUnion(B);
331
341
  return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));
332
342
  }
343
+ function iintersection(a, b) {
344
+ if (a.hi < b.lo || a.lo > b.hi) return null;
345
+ return new Interval(Math.max(a.lo, b.lo), Math.min(a.hi, b.hi));
346
+ }
347
+ function uintersection(A, B) {
348
+ if (A.isEmpty() || B.isEmpty()) return EMPTY;
349
+ if (A.isFull()) return B;
350
+ if (B.isFull()) return A;
351
+ const result = [];
352
+ let [PA, PB] = [0, 0];
353
+ while (PA < A.intervals.length && PB < B.intervals.length) {
354
+ const a = A.intervals[PA];
355
+ const b = B.intervals[PB];
356
+ const aintb = iintersection(a, b);
357
+ if (aintb !== null) {
358
+ result.push(aintb);
359
+ }
360
+ if (a.hi > b.hi) PB += 1;
361
+ else PA += 1;
362
+ }
363
+ return new Union(result);
364
+ }
365
+ function intersection(A, B) {
366
+ typeCheckIsIntervalOrUnion(A);
367
+ typeCheckIsIntervalOrUnion(B);
368
+ return uintersection(toUnion(A), toUnion(B));
369
+ }
370
+ function ucomplement(U) {
371
+ if (U.isEmpty()) return new Union([new Interval(-Infinity, Infinity)]);
372
+ if (U.isFull()) return EMPTY;
373
+ const result = [];
374
+ if (U.intervals[0].lo !== -Infinity) {
375
+ result.push(new Interval(-Infinity, U.intervals[0].lo));
376
+ }
377
+ for (let i = 0; i < U.intervals.length - 1; i++) {
378
+ result.push(new Interval(U.intervals[i].hi, U.intervals[i + 1].lo));
379
+ }
380
+ if (U.intervals[U.intervals.length - 1].hi !== Infinity) {
381
+ result.push(new Interval(U.intervals[U.intervals.length - 1].hi, Infinity));
382
+ }
383
+ return union(result);
384
+ }
385
+ function complement(A) {
386
+ typeCheckIsIntervalOrUnion(A);
387
+ return ucomplement(toUnion(A));
388
+ }
333
389
 
334
390
  // src/arithmetic.ts
335
391
  function leftAdd(a, b) {
@@ -646,6 +702,11 @@ function usqrt(U) {
646
702
  );
647
703
  }
648
704
  var sqrt = makeUnaryOpEither(usqrt);
705
+ function usqinv(U) {
706
+ const x = usqrt(U);
707
+ return union(uneg(x).intervals.concat(x.intervals));
708
+ }
709
+ var sqinv = makeUnaryOpEither(usqinv);
649
710
 
650
711
  // src/trigonometry.ts
651
712
  var pi = Math.PI;
@@ -729,6 +790,7 @@ var tan = makeUnaryOpEither(utan);
729
790
  abs,
730
791
  add,
731
792
  bounded,
793
+ complement,
732
794
  cos,
733
795
  defaultNumbers,
734
796
  disjoint,
@@ -741,12 +803,14 @@ var tan = makeUnaryOpEither(utan);
741
803
  idisjoint,
742
804
  idiv,
743
805
  iexp,
806
+ iintersection,
744
807
  ilog,
745
808
  imax,
746
809
  imin,
747
810
  imul,
748
811
  ineg,
749
812
  inter,
813
+ intersection,
750
814
  interval,
751
815
  intervalType,
752
816
  ioverlap,
@@ -775,6 +839,7 @@ var tan = makeUnaryOpEither(utan);
775
839
  prev,
776
840
  rightMul,
777
841
  sin,
842
+ sqinv,
778
843
  sqrt,
779
844
  sub,
780
845
  tan,
@@ -784,9 +849,11 @@ var tan = makeUnaryOpEither(utan);
784
849
  typeCheckIsUnion,
785
850
  uabs,
786
851
  uadd,
852
+ ucomplement,
787
853
  ucos,
788
854
  udiv,
789
855
  uexp,
856
+ uintersection,
790
857
  ulog,
791
858
  umax,
792
859
  umin,
@@ -796,6 +863,7 @@ var tan = makeUnaryOpEither(utan);
796
863
  upow,
797
864
  upowInt,
798
865
  usin,
866
+ usqinv,
799
867
  usqrt,
800
868
  usub,
801
869
  utan,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/nextafter.ts","../src/interval.ts","../src/union.ts","../src/compare.ts","../src/arithmetic.ts","../src/math.ts","../src/trigonometry.ts"],"sourcesContent":["export * from \"./nextafter.ts\";\nexport * from \"./interval.ts\";\nexport * from \"./compare.ts\";\nexport * from \"./union.ts\";\nexport * from \"./arithmetic.ts\";\nexport * from \"./math.ts\";\nexport * from \"./trigonometry.ts\";\n","// Reuse a global buffer to avoid allocations\nconst buffer = new ArrayBuffer(8);\nconst floatView = new Float64Array(buffer);\nconst intView = new BigUint64Array(buffer);\n\n// Implementation of the C function nextafter(x, Infinity)\nexport function next(x: number): number {\n if (x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x > 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n\n// Implementation of the C function nextafter(x, -Infinity)\nexport function prev(x: number): number {\n if (x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x < 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n","export const defaultNumbers = (x: number) => x.toString();\n\nexport class Interval {\n constructor(readonly lo: number, readonly hi: number) {}\n\n public isFull(): boolean {\n return this.lo === -Infinity && this.hi === Infinity;\n }\n\n public isFinite(): boolean {\n return isFinite(this.lo) && isFinite(this.hi);\n }\n\n public isDegenerate(): boolean {\n return this.lo === this.hi;\n }\n\n public contains(value: number): boolean {\n return this.lo <= value && value <= this.hi;\n }\n\n public superset(other: Interval): boolean {\n return this.contains(other.lo) && this.contains(other.hi);\n }\n\n public subset(other: Interval): boolean {\n return other.superset(this);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers): string {\n return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\nfunction typeCheckIntervalBound(v: any) {\n if (typeof v !== \"number\") {\n throw TypeError(`Interval bounds must be a number, got ${typeof v}`);\n }\n if (isNaN(v)) {\n throw TypeError(`Interval bounds must not be NaN`);\n }\n}\n\n// Construct an interval\n// If two bounds are given, create [a, b]\n// If a single bound is given, create [v, v], a singleton interval [v, v] which\n// contains only one float, also sometimes called a \"degenerate\" interval\n// Bounds may be infinite but must obey a <= b\nexport function interval(a: number, b?: number): Interval {\n if (typeof b === \"undefined\") {\n b = a;\n }\n typeCheckIntervalBound(a);\n typeCheckIntervalBound(b);\n\n if (a > b) {\n throw TypeError(\"Interval bound must be such that lo <= hi\");\n }\n if (a === Infinity) {\n throw TypeError(\"Interval lower bound cannot be Infinity\");\n }\n if (b === -Infinity) {\n throw TypeError(\"Interval lower bound cannot be -Infinity\");\n }\n\n return new Interval(a, b);\n}\n\nexport const inter = interval; // alias\n\n// The full interval [-∞, ∞]\n// All non NaN IEEE floating point numbers are inside the full interval, including infinities\nexport const FULL: Interval = new Interval(-Infinity, Infinity);\n\nexport function typeCheckIsInterval(x: any): x is Interval {\n if (!(x instanceof Interval)) {\n throw TypeError(`Argument must be an interval (got type ${typeof x})`);\n }\n return true;\n}\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, defaultNumbers, typeCheckIsInterval } from \"./interval.ts\";\n\nexport class Union {\n constructor(readonly intervals: Interval[]) {}\n\n public isEmpty(): boolean {\n return this.intervals.length === 0;\n }\n\n public lower(): number {\n if (this.isEmpty()) return Infinity;\n return this.intervals[0].lo;\n }\n\n public upper(): number {\n if (this.isEmpty()) return -Infinity;\n return this.intervals[this.intervals.length - 1].hi;\n }\n\n public contains(value: number): boolean {\n return this.intervals.some((i) => i.contains(value));\n }\n\n public forEach(callback: (x: Interval, index: number) => void) {\n this.intervals.forEach(callback);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers) {\n if (this.intervals.length === 0) return \"{∅}\";\n return this.intervals.map((i) => i.toString(numbers)).join(\" U \");\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\n// Construct a union\n// Minimum disjoint set of a list of intervals\nexport function union(intervals: Interval[]): Union {\n if (intervals.length <= 1) {\n return new Union(intervals);\n }\n\n // Sort by lower bound\n intervals.sort((x, y) => x.lo - y.lo);\n\n const merged: Interval[] = [intervals[0]];\n\n for (let i = 1; i < intervals.length; i++) {\n // If current interval overlaps, merge it\n const last = merged[merged.length - 1];\n const curr = intervals[i];\n if (curr.lo <= last.hi) {\n merged[merged.length - 1] = new Interval(last.lo, Math.max(last.hi, curr.hi));\n } else {\n merged.push(curr);\n }\n }\n\n return new Union(merged);\n}\n\nexport function typeCheckIsUnion(U: any): U is Union {\n if (!(U instanceof Union)) {\n throw TypeError(`Argument must be a Union (got type ${typeof U})`);\n }\n return true;\n}\n\nexport function toUnion(x: Interval | Union): Union {\n if (x instanceof Interval) return new Union([x]);\n return x;\n}\n\ntype UnaryOpInterval = (X: Interval) => Union;\ntype UnaryOpUnion = (U: Union) => Union;\ntype UnaryOpEither = (A: Interval | Union) => Union;\n\ntype BinaryOpInterval = (X: Interval, Y: Interval) => Union;\ntype BinaryOpUnion = (U: Union, V: Union) => Union;\ntype BinaryOpEither = (A: Interval | Union, B: Interval | Union) => Union;\n\n// Generic unary union operation corresponding to a unary interval operation\nexport function makeUnaryOpUnion(op: UnaryOpInterval): UnaryOpUnion {\n return (U: Union): Union => {\n typeCheckIsUnion(U);\n\n // Apply the operator to every interval in the union\n const results: Interval[] = [];\n U.forEach((X) => {\n results.push(...op(X).intervals);\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\n// Generic binary union operation corresponding to a binary interval operation\nexport function makeBinaryOpUnion(op: BinaryOpInterval): BinaryOpUnion {\n return (U: Union, V: Union): Union => {\n typeCheckIsUnion(U);\n typeCheckIsUnion(V);\n // Apply the operator to the cartesian product of the input unions\n const results: Interval[] = [];\n U.forEach((X, i) => {\n V.forEach((Y) => {\n results.push(...op(X, Y).intervals);\n });\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\nexport function isIntervalOrUnion(x: any): boolean {\n return x instanceof Interval || x instanceof Union;\n}\n\nexport function typeCheckIsIntervalOrUnion(x: any): boolean {\n if (!isIntervalOrUnion(x)) {\n throw TypeError(\"Argument must be of type Interval or Union\");\n }\n return true;\n}\n\nexport function makeUnaryOpEither(op: UnaryOpUnion): UnaryOpEither {\n return (A: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n return op(toUnion(A));\n };\n}\n\nexport function makeBinaryOpEither(op: BinaryOpUnion): BinaryOpEither {\n return (A: Interval | Union, B: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return op(toUnion(A), toUnion(B));\n };\n}\n\nexport function bounded(x: number): Union {\n return new Union([new Interval(prev(x), next(x))]);\n}\n\nexport const EMPTY = new Union([]);\n","import { Interval } from \"./interval.ts\";\nimport { Union, typeCheckIsIntervalOrUnion, toUnion } from \"./union.ts\";\n\nexport function ioverlap(a: Interval, b: Interval): boolean {\n return (a.lo <= b.lo && b.lo <= a.hi) || (b.lo <= a.lo && a.lo <= b.hi);\n}\n\nexport function idisjoint(a: Interval, b: Interval): boolean {\n return a.hi < b.lo || a.lo > b.hi;\n}\n\nexport function iuoverlap(X: Interval, U: Union): boolean {\n return U.intervals.some((Y) => ioverlap(X, Y));\n}\n\nexport function iudisjoint(X: Interval, U: Union): boolean {\n return U.intervals.every((Y) => idisjoint(X, Y));\n}\n\nexport function overlap(A: Interval | Union, B: Interval | Union) {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.some((X) => iuoverlap(X, Bunion));\n}\n\nexport function disjoint(A: Interval | Union, B: Interval | Union) {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));\n}\n","import { Interval, FULL, inter, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\n} from \"./union.ts\";\nimport { prev, next } from \"./nextafter.ts\";\n\n// Addition in the context of an interval bound\nfunction leftAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return prev(a + b);\n}\n\nfunction rightAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return next(a + b);\n}\n\n// Interval addition\nexport function iadd(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n return new Union([new Interval(leftAdd(x.lo, y.lo), rightAdd(x.hi, y.hi))]);\n}\n\nexport function ineg(x: Interval): Interval {\n typeCheckIsInterval(x);\n return new Interval(-x.hi, -x.lo);\n}\n\n// Interval subtraction\nexport function isub(x: Interval, y: Interval): Union {\n return iadd(x, ineg(y));\n}\n\n// Multiplication in the context of an interval bound\n// These two functions are needed over simply called prev(a*b) or next(a*b) for\n// two reasons:\n// 1. Multiplying by zero yields zero, even when the other term is an infinity\n// 2. Multiplying by zero yields exactly zero, not prev(0) or next(0)\nexport function leftMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return prev(a * b);\n}\n\nexport function rightMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return next(a * b);\n}\n\n// Interval multiplication\nexport function imul(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (b < 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, d), rightMul(a, c))]); // N1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, c))]); // N1 * P1\n } else {\n return new Union([new Interval(leftMul(a, d), rightMul(a, c))]); // N1 * (M | P0 | N0)\n }\n } else if (a > 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, d))]); // P1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, c), rightMul(b, d))]); // P1 * P1\n } else {\n return new Union([new Interval(leftMul(b, c), rightMul(b, d))]); // P1 * (M | P0 | N0)\n }\n } else {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, c))]); // (M | P0 | N0) * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, d))]); // (M | P0 | N0) * P1\n } else {\n return new Union([\n new Interval(\n Math.min(leftMul(a, d), leftMul(b, c)),\n Math.max(rightMul(a, c), rightMul(b, d))\n ),\n ]); // (M | P0 | N0) * (M | P0 | N0)\n }\n }\n}\n\n// Division in the context of an interval bound\nfunction leftDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n return prev(a / b);\n}\n\nfunction rightDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n return next(a / b);\n}\n\n// Interval types\n// N1: lo <= x < 0\n// N0: lo <= x <= 0\n// M: lo <= x <= hi, with lo < 0 and hi > 0\n// P0: 0 <= x <= hi\n// P1: 0 < x <= hi\n// Z: [0, 0]\nconst enum IType {\n P1,\n P0,\n M,\n N0,\n N1,\n Z,\n}\n\nexport function intervalType(x: Interval): IType {\n if (x.hi < 0) return IType.N1;\n if (x.lo > 0) return IType.P1;\n if (x.lo < 0 && x.hi === 0) return IType.N0;\n if (x.lo === 0 && x.hi > 0) return IType.P0;\n if (x.lo === 0 && x.hi === 0) return IType.Z;\n else return IType.M;\n}\n\n// Interval division\n// See Figure 4 from:\n// \"Hickey, T., Ju, Q. and Van Emden, M.H., 2001. Interval arithmetic: From principles to implementation.\"\nexport function idiv(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const xType = intervalType(x);\n const yType = intervalType(y);\n\n // Zero cases\n if (yType === IType.Z) {\n return EMPTY;\n }\n if (xType === IType.Z) {\n return union([inter(0, 0)]);\n }\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (yType === IType.P1) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), rightDiv(b, c))]); // P1 / P1\n } else if (xType === IType.P0) {\n return union([new Interval(0, rightDiv(b, c))]); // P0 / P1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(a, c), rightDiv(b, c))]); // M / P1\n } else if (xType === IType.N0) {\n return union([new Interval(leftDiv(a, c), -0)]); // N0 / P1\n } else {\n return union([new Interval(leftDiv(a, c), rightDiv(b, d))]); // N1 / P1\n }\n } else if (yType === IType.P0) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), Infinity)]); // P1 / P0\n } else if (xType === IType.P0) {\n return union([new Interval(0, Infinity)]); // P0 / P0\n } else if (xType === IType.M) {\n return union([FULL]); // M / P0\n } else if (xType === IType.N0) {\n return union([new Interval(-Infinity, -0)]); // N0 / P0\n } else {\n return union([new Interval(-Infinity, rightDiv(b, d))]); // N1 / P0\n }\n } else if (yType === IType.M) {\n if (xType === IType.P1) {\n return union([\n new Interval(-Infinity, rightDiv(a, c)),\n new Interval(leftDiv(a, d), Infinity),\n ]); // P1 / M\n } else if (xType == IType.N1) {\n return union([\n new Interval(-Infinity, rightDiv(b, d)),\n new Interval(leftDiv(b, c), Infinity),\n ]); // N1 / M\n } else {\n // P0 / M\n // M / M\n // N0 / M\n return union([FULL]);\n }\n } else if (yType === IType.N0) {\n if (xType === IType.P1) {\n return union([new Interval(-Infinity, rightDiv(a, c))]); // P1 / N0\n } else if (xType === IType.P0) {\n return union([new Interval(-Infinity, -0)]); // P0 / N0\n } else if (xType === IType.M) {\n return union([FULL]); // M / N0\n } else if (xType === IType.N0) {\n return union([new Interval(0, Infinity)]); // N0 / N0\n } else {\n return union([new Interval(leftDiv(b, c), Infinity)]); // N1 / N0\n }\n } else {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, c))]); // P1 / N1\n } else if (xType === IType.P0) {\n return union([new Interval(leftDiv(b, d), -0)]); // P0 / N1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, d))]); // M / N1\n } else if (xType === IType.N0) {\n return union([new Interval(0, rightDiv(a, d))]); // N0 / N1\n } else {\n return union([new Interval(leftDiv(b, c), rightDiv(a, d))]); // N1 / N1\n }\n }\n}\n\nexport const uadd = makeBinaryOpUnion(iadd);\nexport const usub = makeBinaryOpUnion(isub);\nexport const umul = makeBinaryOpUnion(imul);\nexport const udiv = makeBinaryOpUnion(idiv);\n\nexport function uneg(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.slice().reverse().map(ineg));\n}\n\nexport const add = makeBinaryOpEither(uadd);\nexport const sub = makeBinaryOpEither(usub);\nexport const mul = makeBinaryOpEither(umul);\nexport const div = makeBinaryOpEither(udiv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, FULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n} from \"./union.ts\";\nimport { idiv, umul, ineg } from \"./arithmetic.ts\";\n\n// ABS\n\nexport function iabs(X: Interval): Union {\n if (X.lo >= 0) return new Union([X]);\n if (X.hi <= 0) return new Union([ineg(X)]);\n return new Union([new Interval(0, Math.max(-X.lo, X.hi))]);\n}\n\nexport const uabs = makeUnaryOpUnion(iabs);\nexport const abs = makeUnaryOpEither(uabs);\n\n// MIN / MAX\n\nexport function imin(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.min(X.lo, Y.lo), Math.min(X.hi, Y.hi))]);\n}\n\nexport const umin = makeBinaryOpUnion(imin);\nexport const min = makeBinaryOpEither(umin);\n\nexport function imax(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.max(X.lo, Y.lo), Math.max(X.hi, Y.hi))]);\n}\n\nexport const umax = makeBinaryOpUnion(imax);\nexport const max = makeBinaryOpEither(umax);\n\n// EXPONENTIAL\n\nfunction leftExp(x: number): number {\n if (x === -Infinity) return 0;\n if (x === 0) return 1;\n return prev(Math.exp(x));\n}\n\nfunction rightExp(x: number): number {\n if (x === 0) return 1;\n return next(Math.exp(x));\n}\n\nexport function iexp(X: Interval): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftExp(X.lo), rightExp(X.hi));\n}\n\nexport function uexp(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map(iexp));\n}\n\nexport const exp = makeUnaryOpEither(uexp);\n\n// LOGARITHM\n\nfunction leftLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return prev(Math.log(x));\n}\n\nfunction rightLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return next(Math.log(x));\n}\n\nexport function ilog(X: Interval): Union {\n typeCheckIsInterval(X);\n if (X.hi <= 0) return new Union([]);\n if (X.lo <= 0) {\n return new Union([new Interval(-Infinity, rightLog(X.hi))]);\n } else {\n return new Union([new Interval(leftLog(Math.max(0, X.lo)), rightLog(X.hi))]);\n }\n}\n\nexport function ulog(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => ilog(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const log = makeUnaryOpEither(ulog);\n\n// POW (integer exponent)\n\nfunction leftPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return prev(Math.pow(base, exponent));\n}\n\nfunction rightPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return next(Math.pow(base, exponent));\n}\n\nexport function ipowInt(X: Interval, n: number): Union {\n typeCheckIsInterval(X);\n if (!Number.isInteger(n)) {\n throw Error(`ipowint: exponent must be an integer, got ${n}`);\n }\n\n if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);\n if (n === 0) return new Union([X]);\n\n if (X.lo > 0 || n % 2 !== 0) {\n return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);\n } else if (X.hi < 0) {\n return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);\n } else {\n return new Union([new Interval(0, rightPowInt(Math.abs(X.lo), n))]);\n }\n}\n\nexport function upowInt(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((i) => ipowInt(i, n).intervals).flat());\n}\n\nexport function powInt(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowInt(toUnion(A), n);\n}\n\n// POW (real exponent)\n\nexport function ipow(X: Interval, Y: Interval): Union {\n if (X.hi <= 0) return new Union([]);\n return uexp(umul(new Union([Y]), ilog(X)));\n}\n\nexport const upow = makeBinaryOpUnion(ipow);\nexport const pow = makeBinaryOpEither(upow);\n\n// SQRT\n\nfunction leftSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return prev(Math.sqrt(x));\n}\n\nfunction rightSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return next(Math.sqrt(x));\n}\n\nexport function isqrt(X: Interval): Union {\n if (X.hi < 0) return EMPTY;\n return new Union([new Interval(leftSqrt(Math.max(0, X.lo)), rightSqrt(X.hi))]);\n}\n\nexport function usqrt(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => isqrt(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const sqrt = makeUnaryOpEither(usqrt);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, typeCheckIsInterval } from \"./interval.ts\";\nimport { Union, typeCheckIsUnion, makeUnaryOpUnion, makeUnaryOpEither, bounded } from \"./union.ts\";\nimport { udiv, usub } from \"./arithmetic.ts\";\n\nconst pi = Math.PI;\nconst halfpi = Math.PI / 2;\nconst tau = 2 * Math.PI;\nexport function wrapAngle(angle: number): number {\n return ((angle % tau) + tau) % tau;\n}\n\n// Returns the list of integers n such that n*pi is in an interval\nexport function piMultiples(X: Interval): number[] {\n const lower = Math.ceil(X.lo / Math.PI);\n const upper = Math.floor(X.hi / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// Returns the list of integers n such that (pi/2) + n*pi is in an interval\nexport function halfPiMultiples(X: Interval): number[] {\n const lower = Math.ceil((X.lo - Math.PI / 2) / Math.PI);\n const upper = Math.floor((X.hi - Math.PI / 2) / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// COS\n\nfunction leftCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, prev(Math.cos(x))));\n}\n\nfunction rightCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, next(Math.cos(x))));\n}\n\nexport function icos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n const width = X.hi - X.lo;\n if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];\n\n const left = candidates.map(leftCos);\n const right = candidates.map(rightCos);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const ucos = makeUnaryOpUnion(icos);\nexport const cos = makeUnaryOpEither(ucos);\n\n// SIN\n\nfunction leftSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, prev(Math.sin(x))));\n}\n\nfunction rightSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, next(Math.sin(x))));\n}\n\nexport function isin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n const width = X.hi - X.lo;\n if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];\n\n const left = candidates.map(leftSin);\n const right = candidates.map(rightSin);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const usin = makeUnaryOpUnion(isin);\nexport const sin = makeUnaryOpEither(usin);\n\n// TAN\n\nexport function utan(U: Union): Union {\n return udiv(usin(U), ucos(U));\n}\n\nexport const tan = makeUnaryOpEither(utan);\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/nextafter.ts","../src/interval.ts","../src/union.ts","../src/compare.ts","../src/arithmetic.ts","../src/math.ts","../src/trigonometry.ts"],"sourcesContent":["export * from \"./nextafter.ts\";\nexport * from \"./interval.ts\";\nexport * from \"./compare.ts\";\nexport * from \"./union.ts\";\nexport * from \"./arithmetic.ts\";\nexport * from \"./math.ts\";\nexport * from \"./trigonometry.ts\";\n","// Reuse a global buffer to avoid allocations\nconst buffer = new ArrayBuffer(8);\nconst floatView = new Float64Array(buffer);\nconst intView = new BigUint64Array(buffer);\n\n// Implementation of the C function nextafter(x, Infinity)\nexport function next(x: number): number {\n if (x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x > 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n\n// Implementation of the C function nextafter(x, -Infinity)\nexport function prev(x: number): number {\n if (x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x < 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n","export const defaultNumbers = (x: number) => x.toString();\n\nexport class Interval {\n constructor(readonly lo: number, readonly hi: number) {}\n\n public isFull(): boolean {\n return this.lo === -Infinity && this.hi === Infinity;\n }\n\n public isFinite(): boolean {\n return isFinite(this.lo) && isFinite(this.hi);\n }\n\n public isDegenerate(): boolean {\n return this.lo === this.hi;\n }\n\n public contains(value: number): boolean {\n return this.lo <= value && value <= this.hi;\n }\n\n public superset(other: Interval): boolean {\n return this.contains(other.lo) && this.contains(other.hi);\n }\n\n public subset(other: Interval): boolean {\n return other.superset(this);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers): string {\n return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\nfunction typeCheckIntervalBound(v: any) {\n if (typeof v !== \"number\") {\n throw TypeError(`Interval bounds must be a number, got ${typeof v}`);\n }\n if (isNaN(v)) {\n throw TypeError(`Interval bounds must not be NaN`);\n }\n}\n\n// Construct an interval\n// If two bounds are given, create [a, b]\n// If a single bound is given, create [v, v], a singleton interval [v, v] which\n// contains only one float, also sometimes called a \"degenerate\" interval\n// Bounds may be infinite but must obey a <= b\nexport function interval(a: number, b?: number): Interval {\n if (typeof b === \"undefined\") {\n b = a;\n }\n typeCheckIntervalBound(a);\n typeCheckIntervalBound(b);\n\n if (a > b) {\n throw TypeError(\"Interval bound must be such that lo <= hi\");\n }\n if (a === Infinity) {\n throw TypeError(\"Interval lower bound cannot be Infinity\");\n }\n if (b === -Infinity) {\n throw TypeError(\"Interval lower bound cannot be -Infinity\");\n }\n\n return new Interval(a, b);\n}\n\nexport const inter = interval; // alias\n\n// The full interval [-∞, ∞]\n// All non NaN IEEE floating point numbers are inside the full interval, including infinities\nexport const FULL: Interval = new Interval(-Infinity, Infinity);\n\nexport function typeCheckIsInterval(x: any): x is Interval {\n if (!(x instanceof Interval)) {\n throw TypeError(`Argument must be an interval (got type ${typeof x})`);\n }\n return true;\n}\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, defaultNumbers, typeCheckIsInterval } from \"./interval.ts\";\n\nexport class Union {\n constructor(readonly intervals: Interval[]) {}\n\n public isEmpty(): boolean {\n return this.intervals.length === 0;\n }\n\n public isFull(): boolean {\n return (\n this.intervals.length === 1 &&\n this.intervals[0].lo === -Infinity &&\n this.intervals[0].hi === Infinity\n );\n }\n\n public lower(): number {\n if (this.isEmpty()) return Infinity;\n return this.intervals[0].lo;\n }\n\n public upper(): number {\n if (this.isEmpty()) return -Infinity;\n return this.intervals[this.intervals.length - 1].hi;\n }\n\n public contains(value: number): boolean {\n return this.intervals.some((i) => i.contains(value));\n }\n\n public forEach(callback: (x: Interval, index: number) => void) {\n this.intervals.forEach(callback);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers) {\n if (this.intervals.length === 0) return \"{∅}\";\n return this.intervals.map((i) => i.toString(numbers)).join(\" U \");\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\n// Construct a union\n// Minimum disjoint set of a list of intervals\nexport function union(intervals: Interval[]): Union {\n if (intervals.length <= 1) {\n return new Union(intervals);\n }\n\n // Sort by lower bound\n intervals.sort((x, y) => x.lo - y.lo);\n\n const merged: Interval[] = [intervals[0]];\n\n for (let i = 1; i < intervals.length; i++) {\n // If current interval overlaps, merge it\n const last = merged[merged.length - 1];\n const curr = intervals[i];\n if (curr.lo <= last.hi) {\n merged[merged.length - 1] = new Interval(last.lo, Math.max(last.hi, curr.hi));\n } else {\n merged.push(curr);\n }\n }\n\n return new Union(merged);\n}\n\nexport function typeCheckIsUnion(U: any): U is Union {\n if (!(U instanceof Union)) {\n throw TypeError(`Argument must be a Union (got type ${typeof U})`);\n }\n return true;\n}\n\nexport function toUnion(x: Interval | Union): Union {\n if (x instanceof Interval) return new Union([x]);\n return x;\n}\n\ntype UnaryOpInterval = (X: Interval) => Union;\ntype UnaryOpUnion = (U: Union) => Union;\ntype UnaryOpEither = (A: Interval | Union) => Union;\n\ntype BinaryOpInterval = (X: Interval, Y: Interval) => Union;\ntype BinaryOpUnion = (U: Union, V: Union) => Union;\ntype BinaryOpEither = (A: Interval | Union, B: Interval | Union) => Union;\n\n// Generic unary union operation corresponding to a unary interval operation\nexport function makeUnaryOpUnion(op: UnaryOpInterval): UnaryOpUnion {\n return (U: Union): Union => {\n typeCheckIsUnion(U);\n\n // Apply the operator to every interval in the union\n const results: Interval[] = [];\n U.forEach((X) => {\n results.push(...op(X).intervals);\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\n// Generic binary union operation corresponding to a binary interval operation\nexport function makeBinaryOpUnion(op: BinaryOpInterval): BinaryOpUnion {\n return (U: Union, V: Union): Union => {\n typeCheckIsUnion(U);\n typeCheckIsUnion(V);\n // Apply the operator to the cartesian product of the input unions\n const results: Interval[] = [];\n U.forEach((X, i) => {\n V.forEach((Y) => {\n results.push(...op(X, Y).intervals);\n });\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\nexport function isIntervalOrUnion(x: any): boolean {\n return x instanceof Interval || x instanceof Union;\n}\n\nexport function typeCheckIsIntervalOrUnion(x: any): boolean {\n if (!isIntervalOrUnion(x)) {\n throw TypeError(\"Argument must be of type Interval or Union\");\n }\n return true;\n}\n\nexport function makeUnaryOpEither(op: UnaryOpUnion): UnaryOpEither {\n return (A: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n return op(toUnion(A));\n };\n}\n\nexport function makeBinaryOpEither(op: BinaryOpUnion): BinaryOpEither {\n return (A: Interval | Union, B: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return op(toUnion(A), toUnion(B));\n };\n}\n\nexport function bounded(x: number): Union {\n return new Union([new Interval(prev(x), next(x))]);\n}\n\nexport const EMPTY = new Union([]);\n","import { Interval } from \"./interval.ts\";\nimport { Union, typeCheckIsIntervalOrUnion, toUnion, EMPTY, union } from \"./union.ts\";\n\nexport function ioverlap(a: Interval, b: Interval): boolean {\n return a.hi >= b.lo && a.lo <= b.hi;\n}\n\nexport function idisjoint(a: Interval, b: Interval): boolean {\n return a.hi < b.lo || a.lo > b.hi;\n}\n\nexport function iuoverlap(X: Interval, U: Union): boolean {\n return U.intervals.some((Y) => ioverlap(X, Y));\n}\n\nexport function iudisjoint(X: Interval, U: Union): boolean {\n return U.intervals.every((Y) => idisjoint(X, Y));\n}\n\nexport function overlap(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.some((X) => iuoverlap(X, Bunion));\n}\n\nexport function disjoint(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));\n}\n\n// Intersection of two intervals\nexport function iintersection(a: Interval, b: Interval): Interval | null {\n if (a.hi < b.lo || a.lo > b.hi) return null;\n return new Interval(Math.max(a.lo, b.lo), Math.min(a.hi, b.hi));\n}\n\n// Intersection of two unions\nexport function uintersection(A: Union, B: Union): Union {\n if (A.isEmpty() || B.isEmpty()) return EMPTY;\n if (A.isFull()) return B;\n if (B.isFull()) return A;\n\n const result: Interval[] = [];\n let [PA, PB] = [0, 0];\n\n while (PA < A.intervals.length && PB < B.intervals.length) {\n const a = A.intervals[PA];\n const b = B.intervals[PB];\n\n // If they intersect, add it to the result\n const aintb = iintersection(a, b);\n if (aintb !== null) {\n result.push(aintb);\n }\n\n // Increment the pointer of the interval that ends first\n if (a.hi > b.hi) PB += 1;\n else PA += 1;\n }\n\n return new Union(result);\n}\n\n// Intersection of two unions or intervals\nexport function intersection(A: Interval | Union, B: Interval | Union): Union {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return uintersection(toUnion(A), toUnion(B));\n}\n\n// Complement of a union\nexport function ucomplement(U: Union): Union {\n if (U.isEmpty()) return new Union([new Interval(-Infinity, Infinity)]);\n if (U.isFull()) return EMPTY;\n\n const result: Interval[] = [];\n\n // Add interval from -Infinity to first interval if needed\n if (U.intervals[0].lo !== -Infinity) {\n result.push(new Interval(-Infinity, U.intervals[0].lo));\n }\n\n // Add intervals between consecutive intervals in the union\n for (let i = 0; i < U.intervals.length - 1; i++) {\n result.push(new Interval(U.intervals[i].hi, U.intervals[i + 1].lo));\n }\n\n // Add interval from last interval to Infinity if needed\n if (U.intervals[U.intervals.length - 1].hi !== Infinity) {\n result.push(new Interval(U.intervals[U.intervals.length - 1].hi, Infinity));\n }\n\n // Need to call the union constructor, because some intervals might touch\n return union(result);\n}\n\n// Complement of a union or interval\nexport function complement(A: Union | Interval): Union {\n typeCheckIsIntervalOrUnion(A);\n return ucomplement(toUnion(A));\n}\n","import { Interval, FULL, inter, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\n} from \"./union.ts\";\nimport { prev, next } from \"./nextafter.ts\";\n\n// Addition in the context of an interval bound\nfunction leftAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return prev(a + b);\n}\n\nfunction rightAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return next(a + b);\n}\n\n// Interval addition\nexport function iadd(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n return new Union([new Interval(leftAdd(x.lo, y.lo), rightAdd(x.hi, y.hi))]);\n}\n\nexport function ineg(x: Interval): Interval {\n typeCheckIsInterval(x);\n return new Interval(-x.hi, -x.lo);\n}\n\n// Interval subtraction\nexport function isub(x: Interval, y: Interval): Union {\n return iadd(x, ineg(y));\n}\n\n// Multiplication in the context of an interval bound\n// These two functions are needed over simply called prev(a*b) or next(a*b) for\n// two reasons:\n// 1. Multiplying by zero yields zero, even when the other term is an infinity\n// 2. Multiplying by zero yields exactly zero, not prev(0) or next(0)\nexport function leftMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return prev(a * b);\n}\n\nexport function rightMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return next(a * b);\n}\n\n// Interval multiplication\nexport function imul(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (b < 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, d), rightMul(a, c))]); // N1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, c))]); // N1 * P1\n } else {\n return new Union([new Interval(leftMul(a, d), rightMul(a, c))]); // N1 * (M | P0 | N0)\n }\n } else if (a > 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, d))]); // P1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, c), rightMul(b, d))]); // P1 * P1\n } else {\n return new Union([new Interval(leftMul(b, c), rightMul(b, d))]); // P1 * (M | P0 | N0)\n }\n } else {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, c))]); // (M | P0 | N0) * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, d))]); // (M | P0 | N0) * P1\n } else {\n return new Union([\n new Interval(\n Math.min(leftMul(a, d), leftMul(b, c)),\n Math.max(rightMul(a, c), rightMul(b, d))\n ),\n ]); // (M | P0 | N0) * (M | P0 | N0)\n }\n }\n}\n\n// Division in the context of an interval bound\nfunction leftDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n return prev(a / b);\n}\n\nfunction rightDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n return next(a / b);\n}\n\n// Interval types\n// N1: lo <= x < 0\n// N0: lo <= x <= 0\n// M: lo <= x <= hi, with lo < 0 and hi > 0\n// P0: 0 <= x <= hi\n// P1: 0 < x <= hi\n// Z: [0, 0]\nconst enum IType {\n P1,\n P0,\n M,\n N0,\n N1,\n Z,\n}\n\nexport function intervalType(x: Interval): IType {\n if (x.hi < 0) return IType.N1;\n if (x.lo > 0) return IType.P1;\n if (x.lo < 0 && x.hi === 0) return IType.N0;\n if (x.lo === 0 && x.hi > 0) return IType.P0;\n if (x.lo === 0 && x.hi === 0) return IType.Z;\n else return IType.M;\n}\n\n// Interval division\n// See Figure 4 from:\n// \"Hickey, T., Ju, Q. and Van Emden, M.H., 2001. Interval arithmetic: From principles to implementation.\"\nexport function idiv(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const xType = intervalType(x);\n const yType = intervalType(y);\n\n // Zero cases\n if (yType === IType.Z) {\n return EMPTY;\n }\n if (xType === IType.Z) {\n return union([inter(0, 0)]);\n }\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (yType === IType.P1) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), rightDiv(b, c))]); // P1 / P1\n } else if (xType === IType.P0) {\n return union([new Interval(0, rightDiv(b, c))]); // P0 / P1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(a, c), rightDiv(b, c))]); // M / P1\n } else if (xType === IType.N0) {\n return union([new Interval(leftDiv(a, c), -0)]); // N0 / P1\n } else {\n return union([new Interval(leftDiv(a, c), rightDiv(b, d))]); // N1 / P1\n }\n } else if (yType === IType.P0) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), Infinity)]); // P1 / P0\n } else if (xType === IType.P0) {\n return union([new Interval(0, Infinity)]); // P0 / P0\n } else if (xType === IType.M) {\n return union([FULL]); // M / P0\n } else if (xType === IType.N0) {\n return union([new Interval(-Infinity, -0)]); // N0 / P0\n } else {\n return union([new Interval(-Infinity, rightDiv(b, d))]); // N1 / P0\n }\n } else if (yType === IType.M) {\n if (xType === IType.P1) {\n return union([\n new Interval(-Infinity, rightDiv(a, c)),\n new Interval(leftDiv(a, d), Infinity),\n ]); // P1 / M\n } else if (xType == IType.N1) {\n return union([\n new Interval(-Infinity, rightDiv(b, d)),\n new Interval(leftDiv(b, c), Infinity),\n ]); // N1 / M\n } else {\n // P0 / M\n // M / M\n // N0 / M\n return union([FULL]);\n }\n } else if (yType === IType.N0) {\n if (xType === IType.P1) {\n return union([new Interval(-Infinity, rightDiv(a, c))]); // P1 / N0\n } else if (xType === IType.P0) {\n return union([new Interval(-Infinity, -0)]); // P0 / N0\n } else if (xType === IType.M) {\n return union([FULL]); // M / N0\n } else if (xType === IType.N0) {\n return union([new Interval(0, Infinity)]); // N0 / N0\n } else {\n return union([new Interval(leftDiv(b, c), Infinity)]); // N1 / N0\n }\n } else {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, c))]); // P1 / N1\n } else if (xType === IType.P0) {\n return union([new Interval(leftDiv(b, d), -0)]); // P0 / N1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, d))]); // M / N1\n } else if (xType === IType.N0) {\n return union([new Interval(0, rightDiv(a, d))]); // N0 / N1\n } else {\n return union([new Interval(leftDiv(b, c), rightDiv(a, d))]); // N1 / N1\n }\n }\n}\n\nexport const uadd = makeBinaryOpUnion(iadd);\nexport const usub = makeBinaryOpUnion(isub);\nexport const umul = makeBinaryOpUnion(imul);\nexport const udiv = makeBinaryOpUnion(idiv);\n\nexport function uneg(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.slice().reverse().map(ineg));\n}\n\nexport const add = makeBinaryOpEither(uadd);\nexport const sub = makeBinaryOpEither(usub);\nexport const mul = makeBinaryOpEither(umul);\nexport const div = makeBinaryOpEither(udiv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, FULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n} from \"./union.ts\";\nimport { idiv, umul, ineg, uneg } from \"./arithmetic.ts\";\n\n// ABS\n\nexport function iabs(X: Interval): Union {\n if (X.lo >= 0) return new Union([X]);\n if (X.hi <= 0) return new Union([ineg(X)]);\n return new Union([new Interval(0, Math.max(-X.lo, X.hi))]);\n}\n\nexport const uabs = makeUnaryOpUnion(iabs);\nexport const abs = makeUnaryOpEither(uabs);\n\n// MIN / MAX\n\nexport function imin(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.min(X.lo, Y.lo), Math.min(X.hi, Y.hi))]);\n}\n\nexport const umin = makeBinaryOpUnion(imin);\nexport const min = makeBinaryOpEither(umin);\n\nexport function imax(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.max(X.lo, Y.lo), Math.max(X.hi, Y.hi))]);\n}\n\nexport const umax = makeBinaryOpUnion(imax);\nexport const max = makeBinaryOpEither(umax);\n\n// EXPONENTIAL\n\nfunction leftExp(x: number): number {\n if (x === -Infinity) return 0;\n if (x === 0) return 1;\n return prev(Math.exp(x));\n}\n\nfunction rightExp(x: number): number {\n if (x === 0) return 1;\n return next(Math.exp(x));\n}\n\nexport function iexp(X: Interval): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftExp(X.lo), rightExp(X.hi));\n}\n\nexport function uexp(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map(iexp));\n}\n\nexport const exp = makeUnaryOpEither(uexp);\n\n// LOGARITHM\n\nfunction leftLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return prev(Math.log(x));\n}\n\nfunction rightLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return next(Math.log(x));\n}\n\nexport function ilog(X: Interval): Union {\n typeCheckIsInterval(X);\n if (X.hi <= 0) return new Union([]);\n if (X.lo <= 0) {\n return new Union([new Interval(-Infinity, rightLog(X.hi))]);\n } else {\n return new Union([new Interval(leftLog(Math.max(0, X.lo)), rightLog(X.hi))]);\n }\n}\n\nexport function ulog(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => ilog(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const log = makeUnaryOpEither(ulog);\n\n// POW (integer exponent)\n\nfunction leftPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return prev(Math.pow(base, exponent));\n}\n\nfunction rightPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return next(Math.pow(base, exponent));\n}\n\nexport function ipowInt(X: Interval, n: number): Union {\n typeCheckIsInterval(X);\n if (!Number.isInteger(n)) {\n throw Error(`ipowint: exponent must be an integer, got ${n}`);\n }\n\n if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);\n if (n === 0) return new Union([X]);\n\n if (X.lo > 0 || n % 2 !== 0) {\n return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);\n } else if (X.hi < 0) {\n return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);\n } else {\n return new Union([new Interval(0, rightPowInt(Math.abs(X.lo), n))]);\n }\n}\n\nexport function upowInt(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((i) => ipowInt(i, n).intervals).flat());\n}\n\nexport function powInt(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowInt(toUnion(A), n);\n}\n\n// POW (real exponent)\n\nexport function ipow(X: Interval, Y: Interval): Union {\n if (X.hi <= 0) return new Union([]);\n return uexp(umul(new Union([Y]), ilog(X)));\n}\n\nexport const upow = makeBinaryOpUnion(ipow);\nexport const pow = makeBinaryOpEither(upow);\n\n// SQRT\n\nfunction leftSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return prev(Math.sqrt(x));\n}\n\nfunction rightSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return next(Math.sqrt(x));\n}\n\nexport function isqrt(X: Interval): Union {\n if (X.hi < 0) return EMPTY;\n return new Union([new Interval(leftSqrt(Math.max(0, X.lo)), rightSqrt(X.hi))]);\n}\n\nexport function usqrt(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => isqrt(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const sqrt = makeUnaryOpEither(usqrt);\n\n// SQINV: inverse of the square function\n\nexport function usqinv(U: Union): Union {\n const x = usqrt(U);\n return union(uneg(x).intervals.concat(x.intervals));\n}\n\nexport const sqinv = makeUnaryOpEither(usqinv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, typeCheckIsInterval } from \"./interval.ts\";\nimport { Union, typeCheckIsUnion, makeUnaryOpUnion, makeUnaryOpEither, bounded } from \"./union.ts\";\nimport { udiv, usub } from \"./arithmetic.ts\";\n\nconst pi = Math.PI;\nconst halfpi = Math.PI / 2;\nconst tau = 2 * Math.PI;\nexport function wrapAngle(angle: number): number {\n return ((angle % tau) + tau) % tau;\n}\n\n// Returns the list of integers n such that n*pi is in an interval\nexport function piMultiples(X: Interval): number[] {\n const lower = Math.ceil(X.lo / Math.PI);\n const upper = Math.floor(X.hi / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// Returns the list of integers n such that (pi/2) + n*pi is in an interval\nexport function halfPiMultiples(X: Interval): number[] {\n const lower = Math.ceil((X.lo - Math.PI / 2) / Math.PI);\n const upper = Math.floor((X.hi - Math.PI / 2) / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// COS\n\nfunction leftCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, prev(Math.cos(x))));\n}\n\nfunction rightCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, next(Math.cos(x))));\n}\n\nexport function icos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n const width = X.hi - X.lo;\n if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];\n\n const left = candidates.map(leftCos);\n const right = candidates.map(rightCos);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const ucos = makeUnaryOpUnion(icos);\nexport const cos = makeUnaryOpEither(ucos);\n\n// SIN\n\nfunction leftSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, prev(Math.sin(x))));\n}\n\nfunction rightSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, next(Math.sin(x))));\n}\n\nexport function isin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n const width = X.hi - X.lo;\n if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];\n\n const left = candidates.map(leftSin);\n const right = candidates.map(rightSin);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const usin = makeUnaryOpUnion(isin);\nexport const sin = makeUnaryOpEither(usin);\n\n// TAN\n\nexport function utan(U: Union): Union {\n return udiv(usin(U), ucos(U));\n}\n\nexport const tan = makeUnaryOpEither(utan);\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -24,6 +24,7 @@ declare class Union {
24
24
  readonly intervals: Interval[];
25
25
  constructor(intervals: Interval[]);
26
26
  isEmpty(): boolean;
27
+ isFull(): boolean;
27
28
  lower(): number;
28
29
  upper(): number;
29
30
  contains(value: number): boolean;
@@ -55,6 +56,11 @@ declare function iuoverlap(X: Interval, U: Union): boolean;
55
56
  declare function iudisjoint(X: Interval, U: Union): boolean;
56
57
  declare function overlap(A: Interval | Union, B: Interval | Union): boolean;
57
58
  declare function disjoint(A: Interval | Union, B: Interval | Union): boolean;
59
+ declare function iintersection(a: Interval, b: Interval): Interval | null;
60
+ declare function uintersection(A: Union, B: Union): Union;
61
+ declare function intersection(A: Interval | Union, B: Interval | Union): Union;
62
+ declare function ucomplement(U: Union): Union;
63
+ declare function complement(A: Union | Interval): Union;
58
64
 
59
65
  declare function iadd(x: Interval, y: Interval): Union;
60
66
  declare function ineg(x: Interval): Interval;
@@ -106,6 +112,8 @@ declare const pow: (A: Interval | Union, B: Interval | Union) => Union;
106
112
  declare function isqrt(X: Interval): Union;
107
113
  declare function usqrt(U: Union): Union;
108
114
  declare const sqrt: (A: Interval | Union) => Union;
115
+ declare function usqinv(U: Union): Union;
116
+ declare const sqinv: (A: Interval | Union) => Union;
109
117
 
110
118
  declare function wrapAngle(angle: number): number;
111
119
  declare function piMultiples(X: Interval): number[];
@@ -119,4 +127,4 @@ declare const sin: (A: Interval | Union) => Union;
119
127
  declare function utan(U: Union): Union;
120
128
  declare const tan: (A: Interval | Union) => Union;
121
129
 
122
- export { EMPTY, FULL, Interval, Union, abs, add, bounded, cos, defaultNumbers, disjoint, div, exp, halfPiMultiples, iabs, iadd, icos, idisjoint, idiv, iexp, ilog, imax, imin, imul, ineg, inter, interval, intervalType, ioverlap, ipow, ipowInt, isIntervalOrUnion, isin, isqrt, isub, iudisjoint, iuoverlap, leftMul, log, makeBinaryOpEither, makeBinaryOpUnion, makeUnaryOpEither, makeUnaryOpUnion, max, min, mul, next, overlap, piMultiples, pow, powInt, prev, rightMul, sin, sqrt, sub, tan, toUnion, typeCheckIsInterval, typeCheckIsIntervalOrUnion, typeCheckIsUnion, uabs, uadd, ucos, udiv, uexp, ulog, umax, umin, umul, uneg, union, upow, upowInt, usin, usqrt, usub, utan, wrapAngle };
130
+ export { EMPTY, FULL, Interval, Union, abs, add, bounded, complement, cos, defaultNumbers, disjoint, div, exp, halfPiMultiples, iabs, iadd, icos, idisjoint, idiv, iexp, iintersection, ilog, imax, imin, imul, ineg, inter, intersection, interval, intervalType, ioverlap, ipow, ipowInt, isIntervalOrUnion, isin, isqrt, isub, iudisjoint, iuoverlap, leftMul, log, makeBinaryOpEither, makeBinaryOpUnion, makeUnaryOpEither, makeUnaryOpUnion, max, min, mul, next, overlap, piMultiples, pow, powInt, prev, rightMul, sin, sqinv, sqrt, sub, tan, toUnion, typeCheckIsInterval, typeCheckIsIntervalOrUnion, typeCheckIsUnion, uabs, uadd, ucomplement, ucos, udiv, uexp, uintersection, ulog, umax, umin, umul, uneg, union, upow, upowInt, usin, usqinv, usqrt, usub, utan, wrapAngle };
package/dist/index.d.ts CHANGED
@@ -24,6 +24,7 @@ declare class Union {
24
24
  readonly intervals: Interval[];
25
25
  constructor(intervals: Interval[]);
26
26
  isEmpty(): boolean;
27
+ isFull(): boolean;
27
28
  lower(): number;
28
29
  upper(): number;
29
30
  contains(value: number): boolean;
@@ -55,6 +56,11 @@ declare function iuoverlap(X: Interval, U: Union): boolean;
55
56
  declare function iudisjoint(X: Interval, U: Union): boolean;
56
57
  declare function overlap(A: Interval | Union, B: Interval | Union): boolean;
57
58
  declare function disjoint(A: Interval | Union, B: Interval | Union): boolean;
59
+ declare function iintersection(a: Interval, b: Interval): Interval | null;
60
+ declare function uintersection(A: Union, B: Union): Union;
61
+ declare function intersection(A: Interval | Union, B: Interval | Union): Union;
62
+ declare function ucomplement(U: Union): Union;
63
+ declare function complement(A: Union | Interval): Union;
58
64
 
59
65
  declare function iadd(x: Interval, y: Interval): Union;
60
66
  declare function ineg(x: Interval): Interval;
@@ -106,6 +112,8 @@ declare const pow: (A: Interval | Union, B: Interval | Union) => Union;
106
112
  declare function isqrt(X: Interval): Union;
107
113
  declare function usqrt(U: Union): Union;
108
114
  declare const sqrt: (A: Interval | Union) => Union;
115
+ declare function usqinv(U: Union): Union;
116
+ declare const sqinv: (A: Interval | Union) => Union;
109
117
 
110
118
  declare function wrapAngle(angle: number): number;
111
119
  declare function piMultiples(X: Interval): number[];
@@ -119,4 +127,4 @@ declare const sin: (A: Interval | Union) => Union;
119
127
  declare function utan(U: Union): Union;
120
128
  declare const tan: (A: Interval | Union) => Union;
121
129
 
122
- export { EMPTY, FULL, Interval, Union, abs, add, bounded, cos, defaultNumbers, disjoint, div, exp, halfPiMultiples, iabs, iadd, icos, idisjoint, idiv, iexp, ilog, imax, imin, imul, ineg, inter, interval, intervalType, ioverlap, ipow, ipowInt, isIntervalOrUnion, isin, isqrt, isub, iudisjoint, iuoverlap, leftMul, log, makeBinaryOpEither, makeBinaryOpUnion, makeUnaryOpEither, makeUnaryOpUnion, max, min, mul, next, overlap, piMultiples, pow, powInt, prev, rightMul, sin, sqrt, sub, tan, toUnion, typeCheckIsInterval, typeCheckIsIntervalOrUnion, typeCheckIsUnion, uabs, uadd, ucos, udiv, uexp, ulog, umax, umin, umul, uneg, union, upow, upowInt, usin, usqrt, usub, utan, wrapAngle };
130
+ export { EMPTY, FULL, Interval, Union, abs, add, bounded, complement, cos, defaultNumbers, disjoint, div, exp, halfPiMultiples, iabs, iadd, icos, idisjoint, idiv, iexp, iintersection, ilog, imax, imin, imul, ineg, inter, intersection, interval, intervalType, ioverlap, ipow, ipowInt, isIntervalOrUnion, isin, isqrt, isub, iudisjoint, iuoverlap, leftMul, log, makeBinaryOpEither, makeBinaryOpUnion, makeUnaryOpEither, makeUnaryOpUnion, max, min, mul, next, overlap, piMultiples, pow, powInt, prev, rightMul, sin, sqinv, sqrt, sub, tan, toUnion, typeCheckIsInterval, typeCheckIsIntervalOrUnion, typeCheckIsUnion, uabs, uadd, ucomplement, ucos, udiv, uexp, uintersection, ulog, umax, umin, umul, uneg, union, upow, upowInt, usin, usqinv, usqrt, usub, utan, wrapAngle };
package/dist/index.js CHANGED
@@ -103,6 +103,9 @@ var Union = class {
103
103
  isEmpty() {
104
104
  return this.intervals.length === 0;
105
105
  }
106
+ isFull() {
107
+ return this.intervals.length === 1 && this.intervals[0].lo === -Infinity && this.intervals[0].hi === Infinity;
108
+ }
106
109
  lower() {
107
110
  if (this.isEmpty()) return Infinity;
108
111
  return this.intervals[0].lo;
@@ -204,7 +207,7 @@ var EMPTY = new Union([]);
204
207
 
205
208
  // src/compare.ts
206
209
  function ioverlap(a, b) {
207
- return a.lo <= b.lo && b.lo <= a.hi || b.lo <= a.lo && a.lo <= b.hi;
210
+ return a.hi >= b.lo && a.lo <= b.hi;
208
211
  }
209
212
  function idisjoint(a, b) {
210
213
  return a.hi < b.lo || a.lo > b.hi;
@@ -227,6 +230,52 @@ function disjoint(A, B) {
227
230
  const Bunion = toUnion(B);
228
231
  return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));
229
232
  }
233
+ function iintersection(a, b) {
234
+ if (a.hi < b.lo || a.lo > b.hi) return null;
235
+ return new Interval(Math.max(a.lo, b.lo), Math.min(a.hi, b.hi));
236
+ }
237
+ function uintersection(A, B) {
238
+ if (A.isEmpty() || B.isEmpty()) return EMPTY;
239
+ if (A.isFull()) return B;
240
+ if (B.isFull()) return A;
241
+ const result = [];
242
+ let [PA, PB] = [0, 0];
243
+ while (PA < A.intervals.length && PB < B.intervals.length) {
244
+ const a = A.intervals[PA];
245
+ const b = B.intervals[PB];
246
+ const aintb = iintersection(a, b);
247
+ if (aintb !== null) {
248
+ result.push(aintb);
249
+ }
250
+ if (a.hi > b.hi) PB += 1;
251
+ else PA += 1;
252
+ }
253
+ return new Union(result);
254
+ }
255
+ function intersection(A, B) {
256
+ typeCheckIsIntervalOrUnion(A);
257
+ typeCheckIsIntervalOrUnion(B);
258
+ return uintersection(toUnion(A), toUnion(B));
259
+ }
260
+ function ucomplement(U) {
261
+ if (U.isEmpty()) return new Union([new Interval(-Infinity, Infinity)]);
262
+ if (U.isFull()) return EMPTY;
263
+ const result = [];
264
+ if (U.intervals[0].lo !== -Infinity) {
265
+ result.push(new Interval(-Infinity, U.intervals[0].lo));
266
+ }
267
+ for (let i = 0; i < U.intervals.length - 1; i++) {
268
+ result.push(new Interval(U.intervals[i].hi, U.intervals[i + 1].lo));
269
+ }
270
+ if (U.intervals[U.intervals.length - 1].hi !== Infinity) {
271
+ result.push(new Interval(U.intervals[U.intervals.length - 1].hi, Infinity));
272
+ }
273
+ return union(result);
274
+ }
275
+ function complement(A) {
276
+ typeCheckIsIntervalOrUnion(A);
277
+ return ucomplement(toUnion(A));
278
+ }
230
279
 
231
280
  // src/arithmetic.ts
232
281
  function leftAdd(a, b) {
@@ -543,6 +592,11 @@ function usqrt(U) {
543
592
  );
544
593
  }
545
594
  var sqrt = makeUnaryOpEither(usqrt);
595
+ function usqinv(U) {
596
+ const x = usqrt(U);
597
+ return union(uneg(x).intervals.concat(x.intervals));
598
+ }
599
+ var sqinv = makeUnaryOpEither(usqinv);
546
600
 
547
601
  // src/trigonometry.ts
548
602
  var pi = Math.PI;
@@ -625,6 +679,7 @@ export {
625
679
  abs,
626
680
  add,
627
681
  bounded,
682
+ complement,
628
683
  cos,
629
684
  defaultNumbers,
630
685
  disjoint,
@@ -637,12 +692,14 @@ export {
637
692
  idisjoint,
638
693
  idiv,
639
694
  iexp,
695
+ iintersection,
640
696
  ilog,
641
697
  imax,
642
698
  imin,
643
699
  imul,
644
700
  ineg,
645
701
  inter,
702
+ intersection,
646
703
  interval,
647
704
  intervalType,
648
705
  ioverlap,
@@ -671,6 +728,7 @@ export {
671
728
  prev,
672
729
  rightMul,
673
730
  sin,
731
+ sqinv,
674
732
  sqrt,
675
733
  sub,
676
734
  tan,
@@ -680,9 +738,11 @@ export {
680
738
  typeCheckIsUnion,
681
739
  uabs,
682
740
  uadd,
741
+ ucomplement,
683
742
  ucos,
684
743
  udiv,
685
744
  uexp,
745
+ uintersection,
686
746
  ulog,
687
747
  umax,
688
748
  umin,
@@ -692,6 +752,7 @@ export {
692
752
  upow,
693
753
  upowInt,
694
754
  usin,
755
+ usqinv,
695
756
  usqrt,
696
757
  usub,
697
758
  utan,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nextafter.ts","../src/interval.ts","../src/union.ts","../src/compare.ts","../src/arithmetic.ts","../src/math.ts","../src/trigonometry.ts"],"sourcesContent":["// Reuse a global buffer to avoid allocations\nconst buffer = new ArrayBuffer(8);\nconst floatView = new Float64Array(buffer);\nconst intView = new BigUint64Array(buffer);\n\n// Implementation of the C function nextafter(x, Infinity)\nexport function next(x: number): number {\n if (x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x > 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n\n// Implementation of the C function nextafter(x, -Infinity)\nexport function prev(x: number): number {\n if (x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x < 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n","export const defaultNumbers = (x: number) => x.toString();\n\nexport class Interval {\n constructor(readonly lo: number, readonly hi: number) {}\n\n public isFull(): boolean {\n return this.lo === -Infinity && this.hi === Infinity;\n }\n\n public isFinite(): boolean {\n return isFinite(this.lo) && isFinite(this.hi);\n }\n\n public isDegenerate(): boolean {\n return this.lo === this.hi;\n }\n\n public contains(value: number): boolean {\n return this.lo <= value && value <= this.hi;\n }\n\n public superset(other: Interval): boolean {\n return this.contains(other.lo) && this.contains(other.hi);\n }\n\n public subset(other: Interval): boolean {\n return other.superset(this);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers): string {\n return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\nfunction typeCheckIntervalBound(v: any) {\n if (typeof v !== \"number\") {\n throw TypeError(`Interval bounds must be a number, got ${typeof v}`);\n }\n if (isNaN(v)) {\n throw TypeError(`Interval bounds must not be NaN`);\n }\n}\n\n// Construct an interval\n// If two bounds are given, create [a, b]\n// If a single bound is given, create [v, v], a singleton interval [v, v] which\n// contains only one float, also sometimes called a \"degenerate\" interval\n// Bounds may be infinite but must obey a <= b\nexport function interval(a: number, b?: number): Interval {\n if (typeof b === \"undefined\") {\n b = a;\n }\n typeCheckIntervalBound(a);\n typeCheckIntervalBound(b);\n\n if (a > b) {\n throw TypeError(\"Interval bound must be such that lo <= hi\");\n }\n if (a === Infinity) {\n throw TypeError(\"Interval lower bound cannot be Infinity\");\n }\n if (b === -Infinity) {\n throw TypeError(\"Interval lower bound cannot be -Infinity\");\n }\n\n return new Interval(a, b);\n}\n\nexport const inter = interval; // alias\n\n// The full interval [-∞, ∞]\n// All non NaN IEEE floating point numbers are inside the full interval, including infinities\nexport const FULL: Interval = new Interval(-Infinity, Infinity);\n\nexport function typeCheckIsInterval(x: any): x is Interval {\n if (!(x instanceof Interval)) {\n throw TypeError(`Argument must be an interval (got type ${typeof x})`);\n }\n return true;\n}\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, defaultNumbers, typeCheckIsInterval } from \"./interval.ts\";\n\nexport class Union {\n constructor(readonly intervals: Interval[]) {}\n\n public isEmpty(): boolean {\n return this.intervals.length === 0;\n }\n\n public lower(): number {\n if (this.isEmpty()) return Infinity;\n return this.intervals[0].lo;\n }\n\n public upper(): number {\n if (this.isEmpty()) return -Infinity;\n return this.intervals[this.intervals.length - 1].hi;\n }\n\n public contains(value: number): boolean {\n return this.intervals.some((i) => i.contains(value));\n }\n\n public forEach(callback: (x: Interval, index: number) => void) {\n this.intervals.forEach(callback);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers) {\n if (this.intervals.length === 0) return \"{∅}\";\n return this.intervals.map((i) => i.toString(numbers)).join(\" U \");\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\n// Construct a union\n// Minimum disjoint set of a list of intervals\nexport function union(intervals: Interval[]): Union {\n if (intervals.length <= 1) {\n return new Union(intervals);\n }\n\n // Sort by lower bound\n intervals.sort((x, y) => x.lo - y.lo);\n\n const merged: Interval[] = [intervals[0]];\n\n for (let i = 1; i < intervals.length; i++) {\n // If current interval overlaps, merge it\n const last = merged[merged.length - 1];\n const curr = intervals[i];\n if (curr.lo <= last.hi) {\n merged[merged.length - 1] = new Interval(last.lo, Math.max(last.hi, curr.hi));\n } else {\n merged.push(curr);\n }\n }\n\n return new Union(merged);\n}\n\nexport function typeCheckIsUnion(U: any): U is Union {\n if (!(U instanceof Union)) {\n throw TypeError(`Argument must be a Union (got type ${typeof U})`);\n }\n return true;\n}\n\nexport function toUnion(x: Interval | Union): Union {\n if (x instanceof Interval) return new Union([x]);\n return x;\n}\n\ntype UnaryOpInterval = (X: Interval) => Union;\ntype UnaryOpUnion = (U: Union) => Union;\ntype UnaryOpEither = (A: Interval | Union) => Union;\n\ntype BinaryOpInterval = (X: Interval, Y: Interval) => Union;\ntype BinaryOpUnion = (U: Union, V: Union) => Union;\ntype BinaryOpEither = (A: Interval | Union, B: Interval | Union) => Union;\n\n// Generic unary union operation corresponding to a unary interval operation\nexport function makeUnaryOpUnion(op: UnaryOpInterval): UnaryOpUnion {\n return (U: Union): Union => {\n typeCheckIsUnion(U);\n\n // Apply the operator to every interval in the union\n const results: Interval[] = [];\n U.forEach((X) => {\n results.push(...op(X).intervals);\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\n// Generic binary union operation corresponding to a binary interval operation\nexport function makeBinaryOpUnion(op: BinaryOpInterval): BinaryOpUnion {\n return (U: Union, V: Union): Union => {\n typeCheckIsUnion(U);\n typeCheckIsUnion(V);\n // Apply the operator to the cartesian product of the input unions\n const results: Interval[] = [];\n U.forEach((X, i) => {\n V.forEach((Y) => {\n results.push(...op(X, Y).intervals);\n });\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\nexport function isIntervalOrUnion(x: any): boolean {\n return x instanceof Interval || x instanceof Union;\n}\n\nexport function typeCheckIsIntervalOrUnion(x: any): boolean {\n if (!isIntervalOrUnion(x)) {\n throw TypeError(\"Argument must be of type Interval or Union\");\n }\n return true;\n}\n\nexport function makeUnaryOpEither(op: UnaryOpUnion): UnaryOpEither {\n return (A: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n return op(toUnion(A));\n };\n}\n\nexport function makeBinaryOpEither(op: BinaryOpUnion): BinaryOpEither {\n return (A: Interval | Union, B: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return op(toUnion(A), toUnion(B));\n };\n}\n\nexport function bounded(x: number): Union {\n return new Union([new Interval(prev(x), next(x))]);\n}\n\nexport const EMPTY = new Union([]);\n","import { Interval } from \"./interval.ts\";\nimport { Union, typeCheckIsIntervalOrUnion, toUnion } from \"./union.ts\";\n\nexport function ioverlap(a: Interval, b: Interval): boolean {\n return (a.lo <= b.lo && b.lo <= a.hi) || (b.lo <= a.lo && a.lo <= b.hi);\n}\n\nexport function idisjoint(a: Interval, b: Interval): boolean {\n return a.hi < b.lo || a.lo > b.hi;\n}\n\nexport function iuoverlap(X: Interval, U: Union): boolean {\n return U.intervals.some((Y) => ioverlap(X, Y));\n}\n\nexport function iudisjoint(X: Interval, U: Union): boolean {\n return U.intervals.every((Y) => idisjoint(X, Y));\n}\n\nexport function overlap(A: Interval | Union, B: Interval | Union) {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.some((X) => iuoverlap(X, Bunion));\n}\n\nexport function disjoint(A: Interval | Union, B: Interval | Union) {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));\n}\n","import { Interval, FULL, inter, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\n} from \"./union.ts\";\nimport { prev, next } from \"./nextafter.ts\";\n\n// Addition in the context of an interval bound\nfunction leftAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return prev(a + b);\n}\n\nfunction rightAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return next(a + b);\n}\n\n// Interval addition\nexport function iadd(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n return new Union([new Interval(leftAdd(x.lo, y.lo), rightAdd(x.hi, y.hi))]);\n}\n\nexport function ineg(x: Interval): Interval {\n typeCheckIsInterval(x);\n return new Interval(-x.hi, -x.lo);\n}\n\n// Interval subtraction\nexport function isub(x: Interval, y: Interval): Union {\n return iadd(x, ineg(y));\n}\n\n// Multiplication in the context of an interval bound\n// These two functions are needed over simply called prev(a*b) or next(a*b) for\n// two reasons:\n// 1. Multiplying by zero yields zero, even when the other term is an infinity\n// 2. Multiplying by zero yields exactly zero, not prev(0) or next(0)\nexport function leftMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return prev(a * b);\n}\n\nexport function rightMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return next(a * b);\n}\n\n// Interval multiplication\nexport function imul(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (b < 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, d), rightMul(a, c))]); // N1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, c))]); // N1 * P1\n } else {\n return new Union([new Interval(leftMul(a, d), rightMul(a, c))]); // N1 * (M | P0 | N0)\n }\n } else if (a > 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, d))]); // P1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, c), rightMul(b, d))]); // P1 * P1\n } else {\n return new Union([new Interval(leftMul(b, c), rightMul(b, d))]); // P1 * (M | P0 | N0)\n }\n } else {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, c))]); // (M | P0 | N0) * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, d))]); // (M | P0 | N0) * P1\n } else {\n return new Union([\n new Interval(\n Math.min(leftMul(a, d), leftMul(b, c)),\n Math.max(rightMul(a, c), rightMul(b, d))\n ),\n ]); // (M | P0 | N0) * (M | P0 | N0)\n }\n }\n}\n\n// Division in the context of an interval bound\nfunction leftDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n return prev(a / b);\n}\n\nfunction rightDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n return next(a / b);\n}\n\n// Interval types\n// N1: lo <= x < 0\n// N0: lo <= x <= 0\n// M: lo <= x <= hi, with lo < 0 and hi > 0\n// P0: 0 <= x <= hi\n// P1: 0 < x <= hi\n// Z: [0, 0]\nconst enum IType {\n P1,\n P0,\n M,\n N0,\n N1,\n Z,\n}\n\nexport function intervalType(x: Interval): IType {\n if (x.hi < 0) return IType.N1;\n if (x.lo > 0) return IType.P1;\n if (x.lo < 0 && x.hi === 0) return IType.N0;\n if (x.lo === 0 && x.hi > 0) return IType.P0;\n if (x.lo === 0 && x.hi === 0) return IType.Z;\n else return IType.M;\n}\n\n// Interval division\n// See Figure 4 from:\n// \"Hickey, T., Ju, Q. and Van Emden, M.H., 2001. Interval arithmetic: From principles to implementation.\"\nexport function idiv(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const xType = intervalType(x);\n const yType = intervalType(y);\n\n // Zero cases\n if (yType === IType.Z) {\n return EMPTY;\n }\n if (xType === IType.Z) {\n return union([inter(0, 0)]);\n }\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (yType === IType.P1) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), rightDiv(b, c))]); // P1 / P1\n } else if (xType === IType.P0) {\n return union([new Interval(0, rightDiv(b, c))]); // P0 / P1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(a, c), rightDiv(b, c))]); // M / P1\n } else if (xType === IType.N0) {\n return union([new Interval(leftDiv(a, c), -0)]); // N0 / P1\n } else {\n return union([new Interval(leftDiv(a, c), rightDiv(b, d))]); // N1 / P1\n }\n } else if (yType === IType.P0) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), Infinity)]); // P1 / P0\n } else if (xType === IType.P0) {\n return union([new Interval(0, Infinity)]); // P0 / P0\n } else if (xType === IType.M) {\n return union([FULL]); // M / P0\n } else if (xType === IType.N0) {\n return union([new Interval(-Infinity, -0)]); // N0 / P0\n } else {\n return union([new Interval(-Infinity, rightDiv(b, d))]); // N1 / P0\n }\n } else if (yType === IType.M) {\n if (xType === IType.P1) {\n return union([\n new Interval(-Infinity, rightDiv(a, c)),\n new Interval(leftDiv(a, d), Infinity),\n ]); // P1 / M\n } else if (xType == IType.N1) {\n return union([\n new Interval(-Infinity, rightDiv(b, d)),\n new Interval(leftDiv(b, c), Infinity),\n ]); // N1 / M\n } else {\n // P0 / M\n // M / M\n // N0 / M\n return union([FULL]);\n }\n } else if (yType === IType.N0) {\n if (xType === IType.P1) {\n return union([new Interval(-Infinity, rightDiv(a, c))]); // P1 / N0\n } else if (xType === IType.P0) {\n return union([new Interval(-Infinity, -0)]); // P0 / N0\n } else if (xType === IType.M) {\n return union([FULL]); // M / N0\n } else if (xType === IType.N0) {\n return union([new Interval(0, Infinity)]); // N0 / N0\n } else {\n return union([new Interval(leftDiv(b, c), Infinity)]); // N1 / N0\n }\n } else {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, c))]); // P1 / N1\n } else if (xType === IType.P0) {\n return union([new Interval(leftDiv(b, d), -0)]); // P0 / N1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, d))]); // M / N1\n } else if (xType === IType.N0) {\n return union([new Interval(0, rightDiv(a, d))]); // N0 / N1\n } else {\n return union([new Interval(leftDiv(b, c), rightDiv(a, d))]); // N1 / N1\n }\n }\n}\n\nexport const uadd = makeBinaryOpUnion(iadd);\nexport const usub = makeBinaryOpUnion(isub);\nexport const umul = makeBinaryOpUnion(imul);\nexport const udiv = makeBinaryOpUnion(idiv);\n\nexport function uneg(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.slice().reverse().map(ineg));\n}\n\nexport const add = makeBinaryOpEither(uadd);\nexport const sub = makeBinaryOpEither(usub);\nexport const mul = makeBinaryOpEither(umul);\nexport const div = makeBinaryOpEither(udiv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, FULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n} from \"./union.ts\";\nimport { idiv, umul, ineg } from \"./arithmetic.ts\";\n\n// ABS\n\nexport function iabs(X: Interval): Union {\n if (X.lo >= 0) return new Union([X]);\n if (X.hi <= 0) return new Union([ineg(X)]);\n return new Union([new Interval(0, Math.max(-X.lo, X.hi))]);\n}\n\nexport const uabs = makeUnaryOpUnion(iabs);\nexport const abs = makeUnaryOpEither(uabs);\n\n// MIN / MAX\n\nexport function imin(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.min(X.lo, Y.lo), Math.min(X.hi, Y.hi))]);\n}\n\nexport const umin = makeBinaryOpUnion(imin);\nexport const min = makeBinaryOpEither(umin);\n\nexport function imax(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.max(X.lo, Y.lo), Math.max(X.hi, Y.hi))]);\n}\n\nexport const umax = makeBinaryOpUnion(imax);\nexport const max = makeBinaryOpEither(umax);\n\n// EXPONENTIAL\n\nfunction leftExp(x: number): number {\n if (x === -Infinity) return 0;\n if (x === 0) return 1;\n return prev(Math.exp(x));\n}\n\nfunction rightExp(x: number): number {\n if (x === 0) return 1;\n return next(Math.exp(x));\n}\n\nexport function iexp(X: Interval): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftExp(X.lo), rightExp(X.hi));\n}\n\nexport function uexp(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map(iexp));\n}\n\nexport const exp = makeUnaryOpEither(uexp);\n\n// LOGARITHM\n\nfunction leftLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return prev(Math.log(x));\n}\n\nfunction rightLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return next(Math.log(x));\n}\n\nexport function ilog(X: Interval): Union {\n typeCheckIsInterval(X);\n if (X.hi <= 0) return new Union([]);\n if (X.lo <= 0) {\n return new Union([new Interval(-Infinity, rightLog(X.hi))]);\n } else {\n return new Union([new Interval(leftLog(Math.max(0, X.lo)), rightLog(X.hi))]);\n }\n}\n\nexport function ulog(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => ilog(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const log = makeUnaryOpEither(ulog);\n\n// POW (integer exponent)\n\nfunction leftPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return prev(Math.pow(base, exponent));\n}\n\nfunction rightPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return next(Math.pow(base, exponent));\n}\n\nexport function ipowInt(X: Interval, n: number): Union {\n typeCheckIsInterval(X);\n if (!Number.isInteger(n)) {\n throw Error(`ipowint: exponent must be an integer, got ${n}`);\n }\n\n if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);\n if (n === 0) return new Union([X]);\n\n if (X.lo > 0 || n % 2 !== 0) {\n return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);\n } else if (X.hi < 0) {\n return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);\n } else {\n return new Union([new Interval(0, rightPowInt(Math.abs(X.lo), n))]);\n }\n}\n\nexport function upowInt(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((i) => ipowInt(i, n).intervals).flat());\n}\n\nexport function powInt(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowInt(toUnion(A), n);\n}\n\n// POW (real exponent)\n\nexport function ipow(X: Interval, Y: Interval): Union {\n if (X.hi <= 0) return new Union([]);\n return uexp(umul(new Union([Y]), ilog(X)));\n}\n\nexport const upow = makeBinaryOpUnion(ipow);\nexport const pow = makeBinaryOpEither(upow);\n\n// SQRT\n\nfunction leftSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return prev(Math.sqrt(x));\n}\n\nfunction rightSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return next(Math.sqrt(x));\n}\n\nexport function isqrt(X: Interval): Union {\n if (X.hi < 0) return EMPTY;\n return new Union([new Interval(leftSqrt(Math.max(0, X.lo)), rightSqrt(X.hi))]);\n}\n\nexport function usqrt(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => isqrt(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const sqrt = makeUnaryOpEither(usqrt);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, typeCheckIsInterval } from \"./interval.ts\";\nimport { Union, typeCheckIsUnion, makeUnaryOpUnion, makeUnaryOpEither, bounded } from \"./union.ts\";\nimport { udiv, usub } from \"./arithmetic.ts\";\n\nconst pi = Math.PI;\nconst halfpi = Math.PI / 2;\nconst tau = 2 * Math.PI;\nexport function wrapAngle(angle: number): number {\n return ((angle % tau) + tau) % tau;\n}\n\n// Returns the list of integers n such that n*pi is in an interval\nexport function piMultiples(X: Interval): number[] {\n const lower = Math.ceil(X.lo / Math.PI);\n const upper = Math.floor(X.hi / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// Returns the list of integers n such that (pi/2) + n*pi is in an interval\nexport function halfPiMultiples(X: Interval): number[] {\n const lower = Math.ceil((X.lo - Math.PI / 2) / Math.PI);\n const upper = Math.floor((X.hi - Math.PI / 2) / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// COS\n\nfunction leftCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, prev(Math.cos(x))));\n}\n\nfunction rightCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, next(Math.cos(x))));\n}\n\nexport function icos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n const width = X.hi - X.lo;\n if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];\n\n const left = candidates.map(leftCos);\n const right = candidates.map(rightCos);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const ucos = makeUnaryOpUnion(icos);\nexport const cos = makeUnaryOpEither(ucos);\n\n// SIN\n\nfunction leftSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, prev(Math.sin(x))));\n}\n\nfunction rightSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, next(Math.sin(x))));\n}\n\nexport function isin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n const width = X.hi - X.lo;\n if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];\n\n const left = candidates.map(leftSin);\n const right = candidates.map(rightSin);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const usin = makeUnaryOpUnion(isin);\nexport const sin = makeUnaryOpEither(usin);\n\n// TAN\n\nexport function utan(U: Union): Union {\n return udiv(usin(U), ucos(U));\n}\n\nexport const tan = makeUnaryOpEither(utan);\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/nextafter.ts","../src/interval.ts","../src/union.ts","../src/compare.ts","../src/arithmetic.ts","../src/math.ts","../src/trigonometry.ts"],"sourcesContent":["// Reuse a global buffer to avoid allocations\nconst buffer = new ArrayBuffer(8);\nconst floatView = new Float64Array(buffer);\nconst intView = new BigUint64Array(buffer);\n\n// Implementation of the C function nextafter(x, Infinity)\nexport function next(x: number): number {\n if (x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x > 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n\n// Implementation of the C function nextafter(x, -Infinity)\nexport function prev(x: number): number {\n if (x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x < 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n","export const defaultNumbers = (x: number) => x.toString();\n\nexport class Interval {\n constructor(readonly lo: number, readonly hi: number) {}\n\n public isFull(): boolean {\n return this.lo === -Infinity && this.hi === Infinity;\n }\n\n public isFinite(): boolean {\n return isFinite(this.lo) && isFinite(this.hi);\n }\n\n public isDegenerate(): boolean {\n return this.lo === this.hi;\n }\n\n public contains(value: number): boolean {\n return this.lo <= value && value <= this.hi;\n }\n\n public superset(other: Interval): boolean {\n return this.contains(other.lo) && this.contains(other.hi);\n }\n\n public subset(other: Interval): boolean {\n return other.superset(this);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers): string {\n return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\nfunction typeCheckIntervalBound(v: any) {\n if (typeof v !== \"number\") {\n throw TypeError(`Interval bounds must be a number, got ${typeof v}`);\n }\n if (isNaN(v)) {\n throw TypeError(`Interval bounds must not be NaN`);\n }\n}\n\n// Construct an interval\n// If two bounds are given, create [a, b]\n// If a single bound is given, create [v, v], a singleton interval [v, v] which\n// contains only one float, also sometimes called a \"degenerate\" interval\n// Bounds may be infinite but must obey a <= b\nexport function interval(a: number, b?: number): Interval {\n if (typeof b === \"undefined\") {\n b = a;\n }\n typeCheckIntervalBound(a);\n typeCheckIntervalBound(b);\n\n if (a > b) {\n throw TypeError(\"Interval bound must be such that lo <= hi\");\n }\n if (a === Infinity) {\n throw TypeError(\"Interval lower bound cannot be Infinity\");\n }\n if (b === -Infinity) {\n throw TypeError(\"Interval lower bound cannot be -Infinity\");\n }\n\n return new Interval(a, b);\n}\n\nexport const inter = interval; // alias\n\n// The full interval [-∞, ∞]\n// All non NaN IEEE floating point numbers are inside the full interval, including infinities\nexport const FULL: Interval = new Interval(-Infinity, Infinity);\n\nexport function typeCheckIsInterval(x: any): x is Interval {\n if (!(x instanceof Interval)) {\n throw TypeError(`Argument must be an interval (got type ${typeof x})`);\n }\n return true;\n}\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, defaultNumbers, typeCheckIsInterval } from \"./interval.ts\";\n\nexport class Union {\n constructor(readonly intervals: Interval[]) {}\n\n public isEmpty(): boolean {\n return this.intervals.length === 0;\n }\n\n public isFull(): boolean {\n return (\n this.intervals.length === 1 &&\n this.intervals[0].lo === -Infinity &&\n this.intervals[0].hi === Infinity\n );\n }\n\n public lower(): number {\n if (this.isEmpty()) return Infinity;\n return this.intervals[0].lo;\n }\n\n public upper(): number {\n if (this.isEmpty()) return -Infinity;\n return this.intervals[this.intervals.length - 1].hi;\n }\n\n public contains(value: number): boolean {\n return this.intervals.some((i) => i.contains(value));\n }\n\n public forEach(callback: (x: Interval, index: number) => void) {\n this.intervals.forEach(callback);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers) {\n if (this.intervals.length === 0) return \"{∅}\";\n return this.intervals.map((i) => i.toString(numbers)).join(\" U \");\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\n// Construct a union\n// Minimum disjoint set of a list of intervals\nexport function union(intervals: Interval[]): Union {\n if (intervals.length <= 1) {\n return new Union(intervals);\n }\n\n // Sort by lower bound\n intervals.sort((x, y) => x.lo - y.lo);\n\n const merged: Interval[] = [intervals[0]];\n\n for (let i = 1; i < intervals.length; i++) {\n // If current interval overlaps, merge it\n const last = merged[merged.length - 1];\n const curr = intervals[i];\n if (curr.lo <= last.hi) {\n merged[merged.length - 1] = new Interval(last.lo, Math.max(last.hi, curr.hi));\n } else {\n merged.push(curr);\n }\n }\n\n return new Union(merged);\n}\n\nexport function typeCheckIsUnion(U: any): U is Union {\n if (!(U instanceof Union)) {\n throw TypeError(`Argument must be a Union (got type ${typeof U})`);\n }\n return true;\n}\n\nexport function toUnion(x: Interval | Union): Union {\n if (x instanceof Interval) return new Union([x]);\n return x;\n}\n\ntype UnaryOpInterval = (X: Interval) => Union;\ntype UnaryOpUnion = (U: Union) => Union;\ntype UnaryOpEither = (A: Interval | Union) => Union;\n\ntype BinaryOpInterval = (X: Interval, Y: Interval) => Union;\ntype BinaryOpUnion = (U: Union, V: Union) => Union;\ntype BinaryOpEither = (A: Interval | Union, B: Interval | Union) => Union;\n\n// Generic unary union operation corresponding to a unary interval operation\nexport function makeUnaryOpUnion(op: UnaryOpInterval): UnaryOpUnion {\n return (U: Union): Union => {\n typeCheckIsUnion(U);\n\n // Apply the operator to every interval in the union\n const results: Interval[] = [];\n U.forEach((X) => {\n results.push(...op(X).intervals);\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\n// Generic binary union operation corresponding to a binary interval operation\nexport function makeBinaryOpUnion(op: BinaryOpInterval): BinaryOpUnion {\n return (U: Union, V: Union): Union => {\n typeCheckIsUnion(U);\n typeCheckIsUnion(V);\n // Apply the operator to the cartesian product of the input unions\n const results: Interval[] = [];\n U.forEach((X, i) => {\n V.forEach((Y) => {\n results.push(...op(X, Y).intervals);\n });\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\nexport function isIntervalOrUnion(x: any): boolean {\n return x instanceof Interval || x instanceof Union;\n}\n\nexport function typeCheckIsIntervalOrUnion(x: any): boolean {\n if (!isIntervalOrUnion(x)) {\n throw TypeError(\"Argument must be of type Interval or Union\");\n }\n return true;\n}\n\nexport function makeUnaryOpEither(op: UnaryOpUnion): UnaryOpEither {\n return (A: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n return op(toUnion(A));\n };\n}\n\nexport function makeBinaryOpEither(op: BinaryOpUnion): BinaryOpEither {\n return (A: Interval | Union, B: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return op(toUnion(A), toUnion(B));\n };\n}\n\nexport function bounded(x: number): Union {\n return new Union([new Interval(prev(x), next(x))]);\n}\n\nexport const EMPTY = new Union([]);\n","import { Interval } from \"./interval.ts\";\nimport { Union, typeCheckIsIntervalOrUnion, toUnion, EMPTY, union } from \"./union.ts\";\n\nexport function ioverlap(a: Interval, b: Interval): boolean {\n return a.hi >= b.lo && a.lo <= b.hi;\n}\n\nexport function idisjoint(a: Interval, b: Interval): boolean {\n return a.hi < b.lo || a.lo > b.hi;\n}\n\nexport function iuoverlap(X: Interval, U: Union): boolean {\n return U.intervals.some((Y) => ioverlap(X, Y));\n}\n\nexport function iudisjoint(X: Interval, U: Union): boolean {\n return U.intervals.every((Y) => idisjoint(X, Y));\n}\n\nexport function overlap(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.some((X) => iuoverlap(X, Bunion));\n}\n\nexport function disjoint(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));\n}\n\n// Intersection of two intervals\nexport function iintersection(a: Interval, b: Interval): Interval | null {\n if (a.hi < b.lo || a.lo > b.hi) return null;\n return new Interval(Math.max(a.lo, b.lo), Math.min(a.hi, b.hi));\n}\n\n// Intersection of two unions\nexport function uintersection(A: Union, B: Union): Union {\n if (A.isEmpty() || B.isEmpty()) return EMPTY;\n if (A.isFull()) return B;\n if (B.isFull()) return A;\n\n const result: Interval[] = [];\n let [PA, PB] = [0, 0];\n\n while (PA < A.intervals.length && PB < B.intervals.length) {\n const a = A.intervals[PA];\n const b = B.intervals[PB];\n\n // If they intersect, add it to the result\n const aintb = iintersection(a, b);\n if (aintb !== null) {\n result.push(aintb);\n }\n\n // Increment the pointer of the interval that ends first\n if (a.hi > b.hi) PB += 1;\n else PA += 1;\n }\n\n return new Union(result);\n}\n\n// Intersection of two unions or intervals\nexport function intersection(A: Interval | Union, B: Interval | Union): Union {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return uintersection(toUnion(A), toUnion(B));\n}\n\n// Complement of a union\nexport function ucomplement(U: Union): Union {\n if (U.isEmpty()) return new Union([new Interval(-Infinity, Infinity)]);\n if (U.isFull()) return EMPTY;\n\n const result: Interval[] = [];\n\n // Add interval from -Infinity to first interval if needed\n if (U.intervals[0].lo !== -Infinity) {\n result.push(new Interval(-Infinity, U.intervals[0].lo));\n }\n\n // Add intervals between consecutive intervals in the union\n for (let i = 0; i < U.intervals.length - 1; i++) {\n result.push(new Interval(U.intervals[i].hi, U.intervals[i + 1].lo));\n }\n\n // Add interval from last interval to Infinity if needed\n if (U.intervals[U.intervals.length - 1].hi !== Infinity) {\n result.push(new Interval(U.intervals[U.intervals.length - 1].hi, Infinity));\n }\n\n // Need to call the union constructor, because some intervals might touch\n return union(result);\n}\n\n// Complement of a union or interval\nexport function complement(A: Union | Interval): Union {\n typeCheckIsIntervalOrUnion(A);\n return ucomplement(toUnion(A));\n}\n","import { Interval, FULL, inter, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\n} from \"./union.ts\";\nimport { prev, next } from \"./nextafter.ts\";\n\n// Addition in the context of an interval bound\nfunction leftAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return prev(a + b);\n}\n\nfunction rightAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return next(a + b);\n}\n\n// Interval addition\nexport function iadd(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n return new Union([new Interval(leftAdd(x.lo, y.lo), rightAdd(x.hi, y.hi))]);\n}\n\nexport function ineg(x: Interval): Interval {\n typeCheckIsInterval(x);\n return new Interval(-x.hi, -x.lo);\n}\n\n// Interval subtraction\nexport function isub(x: Interval, y: Interval): Union {\n return iadd(x, ineg(y));\n}\n\n// Multiplication in the context of an interval bound\n// These two functions are needed over simply called prev(a*b) or next(a*b) for\n// two reasons:\n// 1. Multiplying by zero yields zero, even when the other term is an infinity\n// 2. Multiplying by zero yields exactly zero, not prev(0) or next(0)\nexport function leftMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return prev(a * b);\n}\n\nexport function rightMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return next(a * b);\n}\n\n// Interval multiplication\nexport function imul(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (b < 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, d), rightMul(a, c))]); // N1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, c))]); // N1 * P1\n } else {\n return new Union([new Interval(leftMul(a, d), rightMul(a, c))]); // N1 * (M | P0 | N0)\n }\n } else if (a > 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, d))]); // P1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, c), rightMul(b, d))]); // P1 * P1\n } else {\n return new Union([new Interval(leftMul(b, c), rightMul(b, d))]); // P1 * (M | P0 | N0)\n }\n } else {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, c))]); // (M | P0 | N0) * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, d))]); // (M | P0 | N0) * P1\n } else {\n return new Union([\n new Interval(\n Math.min(leftMul(a, d), leftMul(b, c)),\n Math.max(rightMul(a, c), rightMul(b, d))\n ),\n ]); // (M | P0 | N0) * (M | P0 | N0)\n }\n }\n}\n\n// Division in the context of an interval bound\nfunction leftDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n return prev(a / b);\n}\n\nfunction rightDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n return next(a / b);\n}\n\n// Interval types\n// N1: lo <= x < 0\n// N0: lo <= x <= 0\n// M: lo <= x <= hi, with lo < 0 and hi > 0\n// P0: 0 <= x <= hi\n// P1: 0 < x <= hi\n// Z: [0, 0]\nconst enum IType {\n P1,\n P0,\n M,\n N0,\n N1,\n Z,\n}\n\nexport function intervalType(x: Interval): IType {\n if (x.hi < 0) return IType.N1;\n if (x.lo > 0) return IType.P1;\n if (x.lo < 0 && x.hi === 0) return IType.N0;\n if (x.lo === 0 && x.hi > 0) return IType.P0;\n if (x.lo === 0 && x.hi === 0) return IType.Z;\n else return IType.M;\n}\n\n// Interval division\n// See Figure 4 from:\n// \"Hickey, T., Ju, Q. and Van Emden, M.H., 2001. Interval arithmetic: From principles to implementation.\"\nexport function idiv(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const xType = intervalType(x);\n const yType = intervalType(y);\n\n // Zero cases\n if (yType === IType.Z) {\n return EMPTY;\n }\n if (xType === IType.Z) {\n return union([inter(0, 0)]);\n }\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (yType === IType.P1) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), rightDiv(b, c))]); // P1 / P1\n } else if (xType === IType.P0) {\n return union([new Interval(0, rightDiv(b, c))]); // P0 / P1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(a, c), rightDiv(b, c))]); // M / P1\n } else if (xType === IType.N0) {\n return union([new Interval(leftDiv(a, c), -0)]); // N0 / P1\n } else {\n return union([new Interval(leftDiv(a, c), rightDiv(b, d))]); // N1 / P1\n }\n } else if (yType === IType.P0) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), Infinity)]); // P1 / P0\n } else if (xType === IType.P0) {\n return union([new Interval(0, Infinity)]); // P0 / P0\n } else if (xType === IType.M) {\n return union([FULL]); // M / P0\n } else if (xType === IType.N0) {\n return union([new Interval(-Infinity, -0)]); // N0 / P0\n } else {\n return union([new Interval(-Infinity, rightDiv(b, d))]); // N1 / P0\n }\n } else if (yType === IType.M) {\n if (xType === IType.P1) {\n return union([\n new Interval(-Infinity, rightDiv(a, c)),\n new Interval(leftDiv(a, d), Infinity),\n ]); // P1 / M\n } else if (xType == IType.N1) {\n return union([\n new Interval(-Infinity, rightDiv(b, d)),\n new Interval(leftDiv(b, c), Infinity),\n ]); // N1 / M\n } else {\n // P0 / M\n // M / M\n // N0 / M\n return union([FULL]);\n }\n } else if (yType === IType.N0) {\n if (xType === IType.P1) {\n return union([new Interval(-Infinity, rightDiv(a, c))]); // P1 / N0\n } else if (xType === IType.P0) {\n return union([new Interval(-Infinity, -0)]); // P0 / N0\n } else if (xType === IType.M) {\n return union([FULL]); // M / N0\n } else if (xType === IType.N0) {\n return union([new Interval(0, Infinity)]); // N0 / N0\n } else {\n return union([new Interval(leftDiv(b, c), Infinity)]); // N1 / N0\n }\n } else {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, c))]); // P1 / N1\n } else if (xType === IType.P0) {\n return union([new Interval(leftDiv(b, d), -0)]); // P0 / N1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, d))]); // M / N1\n } else if (xType === IType.N0) {\n return union([new Interval(0, rightDiv(a, d))]); // N0 / N1\n } else {\n return union([new Interval(leftDiv(b, c), rightDiv(a, d))]); // N1 / N1\n }\n }\n}\n\nexport const uadd = makeBinaryOpUnion(iadd);\nexport const usub = makeBinaryOpUnion(isub);\nexport const umul = makeBinaryOpUnion(imul);\nexport const udiv = makeBinaryOpUnion(idiv);\n\nexport function uneg(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.slice().reverse().map(ineg));\n}\n\nexport const add = makeBinaryOpEither(uadd);\nexport const sub = makeBinaryOpEither(usub);\nexport const mul = makeBinaryOpEither(umul);\nexport const div = makeBinaryOpEither(udiv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, FULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n} from \"./union.ts\";\nimport { idiv, umul, ineg, uneg } from \"./arithmetic.ts\";\n\n// ABS\n\nexport function iabs(X: Interval): Union {\n if (X.lo >= 0) return new Union([X]);\n if (X.hi <= 0) return new Union([ineg(X)]);\n return new Union([new Interval(0, Math.max(-X.lo, X.hi))]);\n}\n\nexport const uabs = makeUnaryOpUnion(iabs);\nexport const abs = makeUnaryOpEither(uabs);\n\n// MIN / MAX\n\nexport function imin(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.min(X.lo, Y.lo), Math.min(X.hi, Y.hi))]);\n}\n\nexport const umin = makeBinaryOpUnion(imin);\nexport const min = makeBinaryOpEither(umin);\n\nexport function imax(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.max(X.lo, Y.lo), Math.max(X.hi, Y.hi))]);\n}\n\nexport const umax = makeBinaryOpUnion(imax);\nexport const max = makeBinaryOpEither(umax);\n\n// EXPONENTIAL\n\nfunction leftExp(x: number): number {\n if (x === -Infinity) return 0;\n if (x === 0) return 1;\n return prev(Math.exp(x));\n}\n\nfunction rightExp(x: number): number {\n if (x === 0) return 1;\n return next(Math.exp(x));\n}\n\nexport function iexp(X: Interval): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftExp(X.lo), rightExp(X.hi));\n}\n\nexport function uexp(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map(iexp));\n}\n\nexport const exp = makeUnaryOpEither(uexp);\n\n// LOGARITHM\n\nfunction leftLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return prev(Math.log(x));\n}\n\nfunction rightLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return next(Math.log(x));\n}\n\nexport function ilog(X: Interval): Union {\n typeCheckIsInterval(X);\n if (X.hi <= 0) return new Union([]);\n if (X.lo <= 0) {\n return new Union([new Interval(-Infinity, rightLog(X.hi))]);\n } else {\n return new Union([new Interval(leftLog(Math.max(0, X.lo)), rightLog(X.hi))]);\n }\n}\n\nexport function ulog(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => ilog(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const log = makeUnaryOpEither(ulog);\n\n// POW (integer exponent)\n\nfunction leftPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return prev(Math.pow(base, exponent));\n}\n\nfunction rightPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return next(Math.pow(base, exponent));\n}\n\nexport function ipowInt(X: Interval, n: number): Union {\n typeCheckIsInterval(X);\n if (!Number.isInteger(n)) {\n throw Error(`ipowint: exponent must be an integer, got ${n}`);\n }\n\n if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);\n if (n === 0) return new Union([X]);\n\n if (X.lo > 0 || n % 2 !== 0) {\n return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);\n } else if (X.hi < 0) {\n return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);\n } else {\n return new Union([new Interval(0, rightPowInt(Math.abs(X.lo), n))]);\n }\n}\n\nexport function upowInt(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((i) => ipowInt(i, n).intervals).flat());\n}\n\nexport function powInt(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowInt(toUnion(A), n);\n}\n\n// POW (real exponent)\n\nexport function ipow(X: Interval, Y: Interval): Union {\n if (X.hi <= 0) return new Union([]);\n return uexp(umul(new Union([Y]), ilog(X)));\n}\n\nexport const upow = makeBinaryOpUnion(ipow);\nexport const pow = makeBinaryOpEither(upow);\n\n// SQRT\n\nfunction leftSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return prev(Math.sqrt(x));\n}\n\nfunction rightSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return next(Math.sqrt(x));\n}\n\nexport function isqrt(X: Interval): Union {\n if (X.hi < 0) return EMPTY;\n return new Union([new Interval(leftSqrt(Math.max(0, X.lo)), rightSqrt(X.hi))]);\n}\n\nexport function usqrt(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => isqrt(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const sqrt = makeUnaryOpEither(usqrt);\n\n// SQINV: inverse of the square function\n\nexport function usqinv(U: Union): Union {\n const x = usqrt(U);\n return union(uneg(x).intervals.concat(x.intervals));\n}\n\nexport const sqinv = makeUnaryOpEither(usqinv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, typeCheckIsInterval } from \"./interval.ts\";\nimport { Union, typeCheckIsUnion, makeUnaryOpUnion, makeUnaryOpEither, bounded } from \"./union.ts\";\nimport { udiv, usub } from \"./arithmetic.ts\";\n\nconst pi = Math.PI;\nconst halfpi = Math.PI / 2;\nconst tau = 2 * Math.PI;\nexport function wrapAngle(angle: number): number {\n return ((angle % tau) + tau) % tau;\n}\n\n// Returns the list of integers n such that n*pi is in an interval\nexport function piMultiples(X: Interval): number[] {\n const lower = Math.ceil(X.lo / Math.PI);\n const upper = Math.floor(X.hi / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// Returns the list of integers n such that (pi/2) + n*pi is in an interval\nexport function halfPiMultiples(X: Interval): number[] {\n const lower = Math.ceil((X.lo - Math.PI / 2) / Math.PI);\n const upper = Math.floor((X.hi - Math.PI / 2) / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// COS\n\nfunction leftCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, prev(Math.cos(x))));\n}\n\nfunction rightCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, next(Math.cos(x))));\n}\n\nexport function icos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n const width = X.hi - X.lo;\n if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];\n\n const left = candidates.map(leftCos);\n const right = candidates.map(rightCos);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const ucos = makeUnaryOpUnion(icos);\nexport const cos = makeUnaryOpEither(ucos);\n\n// SIN\n\nfunction leftSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, prev(Math.sin(x))));\n}\n\nfunction rightSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, next(Math.sin(x))));\n}\n\nexport function isin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n const width = X.hi - X.lo;\n if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];\n\n const left = candidates.map(leftSin);\n const right = candidates.map(rightSin);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const usin = makeUnaryOpUnion(isin);\nexport const sin = makeUnaryOpEither(usin);\n\n// TAN\n\nexport function utan(U: Union): Union {\n return udiv(usin(U), ucos(U));\n}\n\nexport const tan = makeUnaryOpEither(utan);\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "not-so-float",
3
- "license": "MIT",
3
+ "version": "1.2.0",
4
+ "license": "MIT",
4
5
  "repository": {
5
6
  "type": "git",
6
7
  "url": "git+https://github.com/victorpoughon/not-so-float.git"
7
8
  },
8
9
  "private": false,
9
- "version": "1.0.2",
10
10
  "type": "module",
11
11
  "scripts": {
12
12
  "build": "tsup",