* Integer power helper for non-negative integer exponents.
(base: Interval, n: number)
| 80 | function isNaNInterval(x: Interval): boolean { |
| 81 | return Number.isNaN(x.lo) || Number.isNaN(x.hi); |
| 82 | } |
| 83 | const NAN_INTERVAL: Interval = { lo: NaN, hi: NaN }; |
| 84 | |
| 85 | function sqrtRaw(x: Interval | IntervalResult): IntervalResult { |
| 86 | const unwrapped = unwrapOrPropagate(x); |
| 87 | if (!Array.isArray(unwrapped)) return unwrapped; |
| 88 | const [xVal] = unwrapped; |
| 89 | if (isNaNInterval(xVal)) return ok(NAN_INTERVAL); |
| 90 | return _sqrt(xVal); |
| 91 | } |
| 92 | |
| 93 | function _sqrt(x: Interval): IntervalResult { |
| 94 | // Case 1: Entirely negative - no valid values |
| 95 | if (x.hi < 0) { |
| 96 | return { kind: 'empty' }; |
| 97 | } |
| 98 | |
| 99 | // Case 2: Entirely non-negative - straightforward |
| 100 | if (x.lo >= 0) { |
| 101 | return ok({ lo: Math.sqrt(x.lo), hi: Math.sqrt(x.hi) }); |
| 102 | } |
| 103 | |
| 104 | // Case 3: Straddles zero - valid for [0, x.hi], invalid for [x.lo, 0) |
| 105 | return { |
| 106 | kind: 'partial', |