Skip to content

Improve power of complex intervals#745

Open
OlivierHnt wants to merge 4 commits intoJuliaIntervals:masterfrom
OlivierHnt:master
Open

Improve power of complex intervals#745
OlivierHnt wants to merge 4 commits intoJuliaIntervals:masterfrom
OlivierHnt:master

Conversation

@OlivierHnt
Copy link
Member

Since we use the formula exp(y * log(x)) to evaluate x^y when x::Complex{<:Interval}, y::Complex{<:Interval}, we get the following undesirable overestimation:

x = interval(-0.5) + interval(im) * interval(-1e-14, 1e-14)
x^1 # [-0.5, 0.5]_com + im*[-0.5, 0.5]_com
x^2 # [-0.25, 0.25]_com + im*[-0.25, 0.25]_com

yet

x*x # [0.25, 0.25]_com + im*[-1.0e-14, 1.0e-14]_com

This PR implements the following definition for complex powers:

  • If $y = [a, b]$ ($a,b$ finite) with $b-a \le 2$, then there exist $n \in \mathbb{Z}$, $\delta \subset [-1, 1]$ such that $y = n + \delta$.
    We compute
$$x^y = \underbrace{x \cdot \ldots \cdot x}_{n-\text{times}} \cdot \exp(\delta \, \ln(x)).$$
  • If $b-a &gt; 2$, then we can write $y = \cup_{j=1}^d y_j$ where $y_j = n_j + \delta_j$ with $n_j \in \mathbb{Z}$, $\delta_1 \subset [-1, 0.5]$, $\delta_d \subset [-0.5, 1]$, and $\delta_j = [-0.5, 0.5]$ for $j=2, \dots, d-1$.
    We compute
$$x^y = \cup_{j=1}^d x^{y_j} = \cup_{j=1}^d \underbrace{x \cdot \ldots \cdot x}_{n_j-\text{times}} \cdot \exp(\delta_j \, \ln(x)).$$
  • If $y$ is not in the above two forms (i.e., $y$ is real and unbounded, or $y$ has a non-zero imaginary part), then $x^y = \exp(y \, \ln(x))$.

With this PR

x = interval(-0.5) + interval(im) * interval(-1e-14, 1e-14)
x^1 # [-0.5, -0.5]_com + im*[-1.0e-14, 1.0e-14]_com
x^2 # [0.25, 0.25]_com + im*[-1.0e-14, 1.0e-14]_com

@OlivierHnt OlivierHnt requested a review from Kolaru March 9, 2026 12:47
@github-actions
Copy link
Contributor

github-actions bot commented Mar 9, 2026

Benchmark Results (Julia v1)

Time benchmarks
master e87aac7... master / e87aac7...
BigFloat MPFI/basics/* 24.7 ± 4 μs 25.8 ± 4 μs 0.958 ± 0.22
BigFloat MPFI/basics/+ 13.2 ± 3.9 μs 12.5 ± 4.1 μs 1.05 ± 0.47
BigFloat MPFI/basics/- 17.5 ± 4.1 μs 17.1 ± 3.9 μs 1.03 ± 0.34
BigFloat MPFI/basics// 19 ± 4 μs 19.3 ± 4 μs 0.988 ± 0.29
BigFloat MPFI/basics/abs 10.3 ± 3.9 μs 10.2 ± 3.9 μs 1 ± 0.54
BigFloat MPFI/basics/acos 0.67 ± 0.0084 ms 0.674 ± 0.0083 ms 0.994 ± 0.017
BigFloat MPFI/basics/asin 0.646 ± 0.0095 ms 0.649 ± 0.0083 ms 0.994 ± 0.019
BigFloat MPFI/basics/atan 2.06 ± 0.0072 ms 2.07 ± 0.0076 ms 0.998 ± 0.005
BigFloat MPFI/basics/cos 0.355 ± 0.009 ms 0.367 ± 0.0092 ms 0.966 ± 0.034
BigFloat MPFI/basics/cosh 0.426 ± 0.011 ms 0.425 ± 0.011 ms 1 ± 0.036
BigFloat MPFI/basics/exp 0.5 ± 0.011 ms 0.499 ± 0.01 ms 1 ± 0.03
BigFloat MPFI/basics/inv 18.9 ± 3.9 μs 19.3 ± 3.7 μs 0.979 ± 0.28
BigFloat MPFI/basics/log 0.465 ± 0.0089 ms 0.465 ± 0.0089 ms 0.999 ± 0.027
BigFloat MPFI/basics/sin 0.457 ± 0.0099 ms 0.471 ± 0.0098 ms 0.969 ± 0.029
BigFloat MPFI/basics/sinh 0.566 ± 0.0098 ms 0.567 ± 0.0095 ms 0.998 ± 0.024
BigFloat MPFI/basics/sqrt 29 ± 8.2 μs 28.5 ± 7.8 μs 1.02 ± 0.4
BigFloat MPFI/basics/tan 0.38 ± 0.0093 ms 0.405 ± 0.0092 ms 0.941 ± 0.031
BigFloat MPFI/basics/tanh 0.579 ± 0.0099 ms 0.577 ± 0.01 ms 1 ± 0.024
BigFloat bareinterval/basics/* 0.0426 ± 0.0025 ms 0.0425 ± 0.0029 ms 1 ± 0.089
BigFloat bareinterval/basics/+ 24.3 ± 3.8 μs 23.6 ± 3.7 μs 1.03 ± 0.23
BigFloat bareinterval/basics/- 23.5 ± 3.5 μs 23.7 ± 3.7 μs 0.99 ± 0.22
BigFloat bareinterval/basics// 20.7 ± 5.6 μs 20.7 ± 5.6 μs 0.998 ± 0.38
BigFloat bareinterval/basics/abs 16.7 ± 3.5 μs 17.3 ± 3.6 μs 0.966 ± 0.29
BigFloat bareinterval/basics/acos 0.705 ± 0.03 ms 0.71 ± 0.029 ms 0.992 ± 0.059
BigFloat bareinterval/basics/asin 0.689 ± 0.026 ms 0.691 ± 0.025 ms 0.997 ± 0.052
BigFloat bareinterval/basics/atan 2.07 ± 0.0094 ms 2.07 ± 0.0063 ms 1 ± 0.0055
BigFloat bareinterval/basics/cos 0.338 ± 0.099 ms 0.336 ± 0.1 ms 1 ± 0.42
BigFloat bareinterval/basics/cosh 0.468 ± 0.028 ms 0.47 ± 0.027 ms 0.998 ± 0.082
BigFloat bareinterval/basics/exp 0.507 ± 0.01 ms 0.505 ± 0.01 ms 1 ± 0.029
BigFloat bareinterval/basics/inv 26.5 ± 3.6 μs 26.7 ± 3.7 μs 0.994 ± 0.19
BigFloat bareinterval/basics/log 0.515 ± 0.034 ms 0.516 ± 0.034 ms 0.998 ± 0.094
BigFloat bareinterval/basics/sin 0.472 ± 0.1 ms 0.471 ± 0.1 ms 1 ± 0.31
BigFloat bareinterval/basics/sinh 0.575 ± 0.011 ms 0.574 ± 0.01 ms 1 ± 0.027
BigFloat bareinterval/basics/sqrt 0.0383 ± 0.0029 ms 0.0384 ± 0.0029 ms 0.996 ± 0.11
BigFloat bareinterval/basics/tan 0.332 ± 0.065 ms 0.334 ± 0.065 ms 0.996 ± 0.27
BigFloat bareinterval/basics/tanh 0.591 ± 0.011 ms 0.588 ± 0.011 ms 1 ± 0.027
BigFloat interval/basics/* 0.0459 ± 0.0021 ms 0.0462 ± 0.0021 ms 0.993 ± 0.065
BigFloat interval/basics/+ 27.3 ± 9.6 μs 27 ± 9.4 μs 1.01 ± 0.5
BigFloat interval/basics/- 27.1 ± 9.5 μs 26.5 ± 9.5 μs 1.02 ± 0.52
BigFloat interval/basics// 25.5 ± 5.5 μs 25.7 ± 5.6 μs 0.993 ± 0.3
BigFloat interval/basics/abs 16.4 ± 9 μs 16.3 ± 9.1 μs 1.01 ± 0.79
BigFloat interval/basics/acos 0.697 ± 0.051 ms 0.696 ± 0.049 ms 1 ± 0.1
BigFloat interval/basics/asin 0.678 ± 0.041 ms 0.678 ± 0.039 ms 1 ± 0.084
BigFloat interval/basics/atan 2.08 ± 0.0069 ms 2.08 ± 0.0048 ms 1 ± 0.004
BigFloat interval/basics/cos 0.334 ± 0.012 ms 0.334 ± 0.012 ms 0.999 ± 0.052
BigFloat interval/basics/cosh 0.461 ± 0.026 ms 0.463 ± 0.025 ms 0.996 ± 0.078
BigFloat interval/basics/exp 0.514 ± 0.01 ms 0.515 ± 0.0095 ms 0.999 ± 0.027
BigFloat interval/basics/inv 30.8 ± 8.6 μs 31.4 ± 8.9 μs 0.981 ± 0.39
BigFloat interval/basics/log 0.504 ± 0.049 ms 0.506 ± 0.05 ms 0.997 ± 0.14
BigFloat interval/basics/sin 0.481 ± 0.016 ms 0.478 ± 0.018 ms 1.01 ± 0.05
BigFloat interval/basics/sinh 0.58 ± 0.01 ms 0.581 ± 0.0096 ms 0.998 ± 0.024
BigFloat interval/basics/sqrt 0.042 ± 0.036 ms 0.0425 ± 0.035 ms 0.987 ± 1.2
BigFloat interval/basics/tan 0.281 ± 0.013 ms 0.28 ± 0.012 ms 1 ± 0.062
BigFloat interval/basics/tanh 0.598 ± 0.01 ms 0.597 ± 0.011 ms 1 ± 0.025
bareinterval/basics/* 1.96 ± 0.031 μs 1.94 ± 0.049 μs 1.01 ± 0.03
bareinterval/basics/+ 0.541 ± 0.009 μs 0.531 ± 0.002 μs 1.02 ± 0.017
bareinterval/basics/- 0.551 ± 0.01 μs 0.541 ± 0.01 μs 1.02 ± 0.026
bareinterval/basics// 1.22 ± 0.011 μs 1.23 ± 0.03 μs 0.992 ± 0.026
bareinterval/basics/abs 0.22 ± 0.01 μs 0.21 ± 0.01 μs 1.05 ± 0.069
bareinterval/basics/acos 2.89 ± 0.031 μs 2.94 ± 0.04 μs 0.983 ± 0.017
bareinterval/basics/asin 3.17 ± 0.021 μs 3.15 ± 0.022 μs 1.01 ± 0.0097
bareinterval/basics/atan 13.3 ± 0.2 μs 12.9 ± 0.21 μs 1.03 ± 0.023
bareinterval/basics/cos 0.0505 ± 0.0076 ms 0.052 ± 0.00095 ms 0.972 ± 0.15
bareinterval/basics/cosh 7.26 ± 0.03 μs 7.29 ± 0.031 μs 0.996 ± 0.0059
bareinterval/basics/exp 4.3 ± 0.04 μs 4.32 ± 0.05 μs 0.995 ± 0.015
bareinterval/basics/inv 1.06 ± 0.02 μs 1.05 ± 0.03 μs 1.01 ± 0.034
bareinterval/basics/log 2.12 ± 0.02 μs 6.47 ± 0.03 μs 0.328 ± 0.0034
bareinterval/basics/sin 0.0494 ± 0.021 ms 0.0509 ± 0.02 ms 0.97 ± 0.57
bareinterval/basics/sinh 9.98 ± 0.051 μs 9.97 ± 0.08 μs 1 ± 0.0095
bareinterval/basics/sqrt 1.18 ± 0.02 μs 1.18 ± 0.021 μs 1 ± 0.025
bareinterval/basics/tan 28.7 ± 0.26 μs 29.2 ± 0.31 μs 0.983 ± 0.014
bareinterval/basics/tanh 0.29 ± 0.0083 ms 0.29 ± 0.0081 ms 1 ± 0.04
interval/basics/* 3.17 ± 0.08 μs 3.41 ± 0.069 μs 0.93 ± 0.03
interval/basics/+ 1.48 ± 0.071 μs 1.65 ± 0.07 μs 0.897 ± 0.057
interval/basics/- 1.52 ± 0.09 μs 1.65 ± 0.06 μs 0.921 ± 0.064
interval/basics// 2.45 ± 0.079 μs 2.64 ± 0.06 μs 0.931 ± 0.037
interval/basics/abs 0.932 ± 0.13 μs 0.922 ± 0.12 μs 1.01 ± 0.19
interval/basics/acos 5 ± 0.079 μs 5.18 ± 0.07 μs 0.965 ± 0.02
interval/basics/asin 5.14 ± 0.07 μs 5.28 ± 0.07 μs 0.973 ± 0.019
interval/basics/atan 14.6 ± 0.2 μs 15 ± 0.24 μs 0.975 ± 0.021
interval/basics/cos 0.0704 ± 0.023 ms 0.0711 ± 0.022 ms 0.991 ± 0.45
interval/basics/cosh 10.3 ± 0.07 μs 10.3 ± 0.07 μs 0.998 ± 0.0096
interval/basics/exp 6.62 ± 0.091 μs 6.63 ± 0.09 μs 0.998 ± 0.019
interval/basics/inv 2.04 ± 0.08 μs 2.03 ± 0.08 μs 1 ± 0.056
interval/basics/log 4.95 ± 0.06 μs 9.09 ± 0.07 μs 0.545 ± 0.0078
interval/basics/sin 0.069 ± 0.022 ms 0.0705 ± 0.022 ms 0.979 ± 0.44
interval/basics/sinh 13.2 ± 0.08 μs 13.3 ± 0.081 μs 0.992 ± 0.0085
interval/basics/sqrt 2.12 ± 0.1 μs 2.12 ± 0.08 μs 1 ± 0.06
interval/basics/tan 0.04 ± 0.0024 ms 0.0405 ± 0.0021 ms 0.987 ± 0.078
interval/basics/tanh 0.305 ± 0.0088 ms 0.303 ± 0.0084 ms 1.01 ± 0.04
time_to_load 0.104 ± 0.00089 s 0.107 ± 0.0021 s 0.969 ± 0.021
Memory benchmarks
master e87aac7... master / e87aac7...
BigFloat MPFI/basics/* 0.424 k allocs: 21.3 kB 0.424 k allocs: 21.3 kB 1
BigFloat MPFI/basics/+ 0.302 k allocs: 16.5 kB 0.302 k allocs: 16.5 kB 1
BigFloat MPFI/basics/- 0.402 k allocs: 20.4 kB 0.402 k allocs: 20.4 kB 1
BigFloat MPFI/basics// 0.345 k allocs: 18.2 kB 0.345 k allocs: 18.2 kB 1
BigFloat MPFI/basics/abs 0.324 k allocs: 17.4 kB 0.324 k allocs: 17.4 kB 1
BigFloat MPFI/basics/acos 1.24 k allocs: 0.0445 MB 1.24 k allocs: 0.0445 MB 1
BigFloat MPFI/basics/asin 1.08 k allocs: 0.0355 MB 1.08 k allocs: 0.0355 MB 1
BigFloat MPFI/basics/atan 2.14 k allocs: 0.0543 MB 2.14 k allocs: 0.0543 MB 1
BigFloat MPFI/basics/cos 2.9 k allocs: 0.0975 MB 2.9 k allocs: 0.0975 MB 1
BigFloat MPFI/basics/cosh 0.781 k allocs: 0.0322 MB 0.781 k allocs: 0.0322 MB 1
BigFloat MPFI/basics/exp 0.902 k allocs: 0.036 MB 0.902 k allocs: 0.036 MB 1
BigFloat MPFI/basics/inv 0.351 k allocs: 18.4 kB 0.351 k allocs: 18.4 kB 1
BigFloat MPFI/basics/log 0.407 k allocs: 20.6 kB 0.407 k allocs: 20.6 kB 1
BigFloat MPFI/basics/sin 3.18 k allocs: 0.106 MB 3.18 k allocs: 0.106 MB 1
BigFloat MPFI/basics/sinh 0.915 k allocs: 0.0369 MB 0.915 k allocs: 0.0369 MB 1
BigFloat MPFI/basics/sqrt 0.302 k allocs: 16.5 kB 0.302 k allocs: 16.5 kB 1
BigFloat MPFI/basics/tan 2.8 k allocs: 0.098 MB 2.8 k allocs: 0.098 MB 1
BigFloat MPFI/basics/tanh 0.908 k allocs: 0.0362 MB 0.908 k allocs: 0.0362 MB 1
BigFloat bareinterval/basics/* 0.262 k allocs: 26 kB 0.262 k allocs: 26 kB 1
BigFloat bareinterval/basics/+ 0.202 k allocs: 20.4 kB 0.202 k allocs: 20.4 kB 1
BigFloat bareinterval/basics/- 0.202 k allocs: 20.4 kB 0.202 k allocs: 20.4 kB 1
BigFloat bareinterval/basics// 0.1 k allocs: 10.8 kB 0.1 k allocs: 10.8 kB 1
BigFloat bareinterval/basics/abs 0.199 k allocs: 20.1 kB 0.199 k allocs: 20.1 kB 1
BigFloat bareinterval/basics/acos 1.33 k allocs: 0.0741 MB 1.33 k allocs: 0.0741 MB 1
BigFloat bareinterval/basics/asin 1.23 k allocs: 0.0647 MB 1.23 k allocs: 0.0647 MB 1
BigFloat bareinterval/basics/atan 2.04 k allocs: 0.08 MB 2.04 k allocs: 0.08 MB 1
BigFloat bareinterval/basics/cos 2.45 k allocs: 0.185 MB 2.45 k allocs: 0.185 MB 1
BigFloat bareinterval/basics/cosh 1.01 k allocs: 0.0671 MB 1.01 k allocs: 0.0671 MB 1
BigFloat bareinterval/basics/exp 0.802 k allocs: 0.0397 MB 0.802 k allocs: 0.0397 MB 1
BigFloat bareinterval/basics/inv 0.198 k allocs: 20 kB 0.198 k allocs: 20 kB 1
BigFloat bareinterval/basics/log 0.804 k allocs: 0.0694 MB 0.804 k allocs: 0.0694 MB 1
BigFloat bareinterval/basics/sin 2.9 k allocs: 0.197 MB 2.9 k allocs: 0.197 MB 1
BigFloat bareinterval/basics/sinh 0.815 k allocs: 0.0407 MB 0.815 k allocs: 0.0407 MB 1
BigFloat bareinterval/basics/sqrt 0.304 k allocs: 29.9 kB 0.304 k allocs: 29.9 kB 1
BigFloat bareinterval/basics/tan 1.67 k allocs: 0.124 MB 1.67 k allocs: 0.124 MB 1
BigFloat bareinterval/basics/tanh 0.808 k allocs: 0.0399 MB 0.808 k allocs: 0.0399 MB 1
BigFloat interval/basics/* 0.263 k allocs: 26.8 kB 0.263 k allocs: 26.8 kB 1
BigFloat interval/basics/+ 0.203 k allocs: 21.2 kB 0.203 k allocs: 21.2 kB 1
BigFloat interval/basics/- 0.203 k allocs: 21.2 kB 0.203 k allocs: 21.2 kB 1
BigFloat interval/basics// 0.101 k allocs: 11.6 kB 0.101 k allocs: 11.6 kB 1
BigFloat interval/basics/abs 0.2 k allocs: 20.9 kB 0.2 k allocs: 20.9 kB 1
BigFloat interval/basics/acos 1.77 k allocs: 0.115 MB 1.77 k allocs: 0.115 MB 1
BigFloat interval/basics/asin 1.53 k allocs: 0.0931 MB 1.53 k allocs: 0.0931 MB 1
BigFloat interval/basics/atan 2.04 k allocs: 0.0812 MB 2.04 k allocs: 0.0812 MB 0.999
BigFloat interval/basics/cos 2.45 k allocs: 0.186 MB 2.45 k allocs: 0.186 MB 1
BigFloat interval/basics/cosh 1.01 k allocs: 0.068 MB 1.01 k allocs: 0.068 MB 0.999
BigFloat interval/basics/exp 0.803 k allocs: 0.0407 MB 0.803 k allocs: 0.0409 MB 0.997
BigFloat interval/basics/inv 0.199 k allocs: 20.8 kB 0.199 k allocs: 20.8 kB 1
BigFloat interval/basics/log 1.1 k allocs: 0.0977 MB 1.1 k allocs: 0.0977 MB 1
BigFloat interval/basics/sin 2.9 k allocs: 0.198 MB 2.9 k allocs: 0.198 MB 1
BigFloat interval/basics/sinh 0.816 k allocs: 0.0419 MB 0.816 k allocs: 0.0417 MB 1
BigFloat interval/basics/sqrt 0.758 k allocs: 0.0715 MB 0.758 k allocs: 0.0715 MB 1
BigFloat interval/basics/tan 1.67 k allocs: 0.125 MB 1.67 k allocs: 0.125 MB 1
BigFloat interval/basics/tanh 0.809 k allocs: 0.0409 MB 0.809 k allocs: 0.0409 MB 0.999
bareinterval/basics/* 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/+ 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/- 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics// 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/abs 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/acos 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/asin 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/atan 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/cos 0.56 k allocs: 0.0423 MB 0.56 k allocs: 0.0423 MB 1
bareinterval/basics/cosh 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/exp 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/inv 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/log 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/sin 0.56 k allocs: 0.0423 MB 0.56 k allocs: 0.0423 MB 1
bareinterval/basics/sinh 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/sqrt 2 allocs: 1.62 kB 2 allocs: 1.62 kB 1
bareinterval/basics/tan 0.29 k allocs: 23 kB 0.29 k allocs: 23 kB 1
bareinterval/basics/tanh 1.03 k allocs: 0.0359 MB 1.03 k allocs: 0.0359 MB 1
interval/basics/* 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/+ 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/- 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics// 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/abs 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/acos 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/asin 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/atan 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/cos 0.561 k allocs: 0.0431 MB 0.561 k allocs: 0.0431 MB 1
interval/basics/cosh 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/exp 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/inv 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/log 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/sin 0.561 k allocs: 0.0431 MB 0.561 k allocs: 0.0431 MB 1
interval/basics/sinh 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/sqrt 3 allocs: 2.45 kB 3 allocs: 2.45 kB 1
interval/basics/tan 0.291 k allocs: 24.4 kB 0.291 k allocs: 24.4 kB 1
interval/basics/tanh 1.03 k allocs: 0.0367 MB 1.03 k allocs: 0.0367 MB 1
time_to_load 0.145 k allocs: 11 kB 0.145 k allocs: 11 kB 1

@Kolaru
Copy link
Member

Kolaru commented Mar 10, 2026

This looks good to me. I would just add

  • A comment to the new ^ function saying "See Improve power of complex intervals #745 for a description of the algorithm."
  • Tests checking that x^y is a subset of exp(y * log(x))
  • Tests checking that fastpown(x, n) is a subset of ^(x, interval(n))

@codecov-commenter
Copy link

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 71.79487% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 76.18%. Comparing base (b3f2756) to head (813d65a).
⚠️ Report is 3 commits behind head on master.

Files with missing lines Patch % Lines
src/intervals/arithmetic/power.jl 71.79% 11 Missing ⚠️
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #745      +/-   ##
==========================================
- Coverage   76.37%   76.18%   -0.19%     
==========================================
  Files          31       31              
  Lines        2988     3019      +31     
==========================================
+ Hits         2282     2300      +18     
- Misses        706      719      +13     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@OlivierHnt
Copy link
Member Author

OlivierHnt commented Mar 18, 2026

I could not simply have a test that x^y is a subset of exp(y*log(x)) since the new algorithm uses power by squaring which can accumulates a bit more rounding error than simply performing the exp/log version.

Instead, I check that we do have an improved real part:

x = interval(-0.5) + interval(im) * interval(-1e-14, 1e-14)
y = interval(1.5, 2.5)
res = x^y
ref = exp(y*log(x))
# tighter on the real part (right half-plane)
@test inf(real(ref)) < -0.3 < -1e-13 < inf(real(res))

Let me know if you have any ideas for tests before we merge the PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants