not-so-float 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -12
- package/dist/index.cjs +13 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -52,6 +52,12 @@ Design goals:
|
|
|
52
52
|
npm install not-so-float
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
Import the library with:
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
import * as nsf from "not-so-float";
|
|
59
|
+
```
|
|
60
|
+
|
|
55
61
|
## Outward Rounding
|
|
56
62
|
|
|
57
63
|
The main interest of interval arithmetic is the inclusion property. Any interval
|
|
@@ -211,15 +217,16 @@ function complement(A: Union | Interval): Union;
|
|
|
211
217
|
|
|
212
218
|
<div align="center">
|
|
213
219
|
|
|
214
|
-
| Operation | API function
|
|
215
|
-
| ----------------: |
|
|
216
|
-
| Absolute value | `nsf.abs(A)`
|
|
217
|
-
| Natural logarithm | `nsf.log(A)`
|
|
218
|
-
| Exponential | `nsf.exp(A)`
|
|
219
|
-
| Square root | `nsf.sqrt(A)`
|
|
220
|
-
|
|
|
221
|
-
|
|
|
222
|
-
|
|
|
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)` |
|
|
223
230
|
|
|
224
231
|
</div>
|
|
225
232
|
|
|
@@ -236,6 +243,6 @@ function complement(A: Union | Interval): Union;
|
|
|
236
243
|
|
|
237
244
|
## Future improvements
|
|
238
245
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
@@ -76,6 +76,7 @@ __export(index_exports, {
|
|
|
76
76
|
prev: () => prev,
|
|
77
77
|
rightMul: () => rightMul,
|
|
78
78
|
sin: () => sin,
|
|
79
|
+
sqinv: () => sqinv,
|
|
79
80
|
sqrt: () => sqrt,
|
|
80
81
|
sub: () => sub,
|
|
81
82
|
tan: () => tan,
|
|
@@ -99,6 +100,7 @@ __export(index_exports, {
|
|
|
99
100
|
upow: () => upow,
|
|
100
101
|
upowInt: () => upowInt,
|
|
101
102
|
usin: () => usin,
|
|
103
|
+
usqinv: () => usqinv,
|
|
102
104
|
usqrt: () => usqrt,
|
|
103
105
|
usub: () => usub,
|
|
104
106
|
utan: () => utan,
|
|
@@ -656,13 +658,15 @@ function ipowInt(X, n) {
|
|
|
656
658
|
throw Error(`ipowint: exponent must be an integer, got ${n}`);
|
|
657
659
|
}
|
|
658
660
|
if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);
|
|
659
|
-
if (n === 0) return new Union([
|
|
661
|
+
if (n === 0) return new Union([new Interval(1, 1)]);
|
|
660
662
|
if (X.lo > 0 || n % 2 !== 0) {
|
|
661
663
|
return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);
|
|
662
664
|
} else if (X.hi < 0) {
|
|
663
665
|
return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);
|
|
664
666
|
} else {
|
|
665
|
-
return new Union([
|
|
667
|
+
return new Union([
|
|
668
|
+
new Interval(0, rightPowInt(Math.max(Math.abs(X.hi), Math.abs(X.lo)), n))
|
|
669
|
+
]);
|
|
666
670
|
}
|
|
667
671
|
}
|
|
668
672
|
function upowInt(U, n) {
|
|
@@ -700,6 +704,11 @@ function usqrt(U) {
|
|
|
700
704
|
);
|
|
701
705
|
}
|
|
702
706
|
var sqrt = makeUnaryOpEither(usqrt);
|
|
707
|
+
function usqinv(U) {
|
|
708
|
+
const x = usqrt(U);
|
|
709
|
+
return union(uneg(x).intervals.concat(x.intervals));
|
|
710
|
+
}
|
|
711
|
+
var sqinv = makeUnaryOpEither(usqinv);
|
|
703
712
|
|
|
704
713
|
// src/trigonometry.ts
|
|
705
714
|
var pi = Math.PI;
|
|
@@ -832,6 +841,7 @@ var tan = makeUnaryOpEither(utan);
|
|
|
832
841
|
prev,
|
|
833
842
|
rightMul,
|
|
834
843
|
sin,
|
|
844
|
+
sqinv,
|
|
835
845
|
sqrt,
|
|
836
846
|
sub,
|
|
837
847
|
tan,
|
|
@@ -855,6 +865,7 @@ var tan = makeUnaryOpEither(utan);
|
|
|
855
865
|
upow,
|
|
856
866
|
upowInt,
|
|
857
867
|
usin,
|
|
868
|
+
usqinv,
|
|
858
869
|
usqrt,
|
|
859
870
|
usub,
|
|
860
871
|
utan,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 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 } 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([new Interval(1, 1)]);\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([\n new Interval(0, rightPowInt(Math.max(Math.abs(X.hi), Math.abs(X.lo)), n)),\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
|
@@ -112,6 +112,8 @@ declare const pow: (A: Interval | Union, B: Interval | Union) => Union;
|
|
|
112
112
|
declare function isqrt(X: Interval): Union;
|
|
113
113
|
declare function usqrt(U: Union): Union;
|
|
114
114
|
declare const sqrt: (A: Interval | Union) => Union;
|
|
115
|
+
declare function usqinv(U: Union): Union;
|
|
116
|
+
declare const sqinv: (A: Interval | Union) => Union;
|
|
115
117
|
|
|
116
118
|
declare function wrapAngle(angle: number): number;
|
|
117
119
|
declare function piMultiples(X: Interval): number[];
|
|
@@ -125,4 +127,4 @@ declare const sin: (A: Interval | Union) => Union;
|
|
|
125
127
|
declare function utan(U: Union): Union;
|
|
126
128
|
declare const tan: (A: Interval | Union) => Union;
|
|
127
129
|
|
|
128
|
-
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, sqrt, sub, tan, toUnion, typeCheckIsInterval, typeCheckIsIntervalOrUnion, typeCheckIsUnion, uabs, uadd, ucomplement, ucos, udiv, uexp, uintersection, 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
|
@@ -112,6 +112,8 @@ declare const pow: (A: Interval | Union, B: Interval | Union) => Union;
|
|
|
112
112
|
declare function isqrt(X: Interval): Union;
|
|
113
113
|
declare function usqrt(U: Union): Union;
|
|
114
114
|
declare const sqrt: (A: Interval | Union) => Union;
|
|
115
|
+
declare function usqinv(U: Union): Union;
|
|
116
|
+
declare const sqinv: (A: Interval | Union) => Union;
|
|
115
117
|
|
|
116
118
|
declare function wrapAngle(angle: number): number;
|
|
117
119
|
declare function piMultiples(X: Interval): number[];
|
|
@@ -125,4 +127,4 @@ declare const sin: (A: Interval | Union) => Union;
|
|
|
125
127
|
declare function utan(U: Union): Union;
|
|
126
128
|
declare const tan: (A: Interval | Union) => Union;
|
|
127
129
|
|
|
128
|
-
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, sqrt, sub, tan, toUnion, typeCheckIsInterval, typeCheckIsIntervalOrUnion, typeCheckIsUnion, uabs, uadd, ucomplement, ucos, udiv, uexp, uintersection, 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
|
@@ -548,13 +548,15 @@ function ipowInt(X, n) {
|
|
|
548
548
|
throw Error(`ipowint: exponent must be an integer, got ${n}`);
|
|
549
549
|
}
|
|
550
550
|
if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);
|
|
551
|
-
if (n === 0) return new Union([
|
|
551
|
+
if (n === 0) return new Union([new Interval(1, 1)]);
|
|
552
552
|
if (X.lo > 0 || n % 2 !== 0) {
|
|
553
553
|
return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);
|
|
554
554
|
} else if (X.hi < 0) {
|
|
555
555
|
return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);
|
|
556
556
|
} else {
|
|
557
|
-
return new Union([
|
|
557
|
+
return new Union([
|
|
558
|
+
new Interval(0, rightPowInt(Math.max(Math.abs(X.hi), Math.abs(X.lo)), n))
|
|
559
|
+
]);
|
|
558
560
|
}
|
|
559
561
|
}
|
|
560
562
|
function upowInt(U, n) {
|
|
@@ -592,6 +594,11 @@ function usqrt(U) {
|
|
|
592
594
|
);
|
|
593
595
|
}
|
|
594
596
|
var sqrt = makeUnaryOpEither(usqrt);
|
|
597
|
+
function usqinv(U) {
|
|
598
|
+
const x = usqrt(U);
|
|
599
|
+
return union(uneg(x).intervals.concat(x.intervals));
|
|
600
|
+
}
|
|
601
|
+
var sqinv = makeUnaryOpEither(usqinv);
|
|
595
602
|
|
|
596
603
|
// src/trigonometry.ts
|
|
597
604
|
var pi = Math.PI;
|
|
@@ -723,6 +730,7 @@ export {
|
|
|
723
730
|
prev,
|
|
724
731
|
rightMul,
|
|
725
732
|
sin,
|
|
733
|
+
sqinv,
|
|
726
734
|
sqrt,
|
|
727
735
|
sub,
|
|
728
736
|
tan,
|
|
@@ -746,6 +754,7 @@ export {
|
|
|
746
754
|
upow,
|
|
747
755
|
upowInt,
|
|
748
756
|
usin,
|
|
757
|
+
usqinv,
|
|
749
758
|
usqrt,
|
|
750
759
|
usub,
|
|
751
760
|
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 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 } 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([new Interval(1, 1)]);\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([\n new Interval(0, rightPowInt(Math.max(Math.abs(X.hi), Math.abs(X.lo)), n)),\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":[]}
|