Skip to content

Fix #790 - #791

Merged
OlivierHnt merged 8 commits into
JuliaIntervals:masterfrom
OlivierHnt:fix-790
Nov 1, 2026
Merged

OlivierHnt merged 8 commits into
JuliaIntervals:masterfrom
OlivierHnt:fix-790

Conversation

@OlivierHnt

@OlivierHnt OlivierHnt commented Nov 1, 2026 •

Copy link
Copy Markdown
Member

Fixes #790.

One commit per item of the issue:

  1. tan and cot returned a bounded result for an interval of width exactly sup(π) containing a pole (> → ≥). sec and csc were already correct.
  2. acot and acoth rounded 1/x in the wrong direction, so some results excluded the true value.
  3. acoth returned ∅ for intervals partly inside [-1, 1] (e.g. [0.5, 2]), and the whole line for [-1, 2]. The tests that recorded ∅ are updated.
  4. The constants π, ℯ, γ, catalan and φ are now computed at the precision of the target type, so a low setprecision at first use no longer gives a loose Float64 π, which made sin/cos wrong. A second commit stops caching Rational{BigInt} constants, whose precision follows the global setting.
  5. Flush-to-zero cannot be checked cheaply, so the docs now warn against set_zero_subnormals(true).
  6. sin, cos, tan, cot, sec and csc threw an error for |x| > floatmax/2, because 2x overflowed. x is now doubled exactly in BigFloat.
  7. Huge thin arguments could give the whole range. The π used for range reduction now has exponent(x) + precision(x) + 64 bits. That makes the reduction exact for every Float16, Float32 and Float64, checked against the closest case for each type.

Follow-up (separate PR): reworking the trig range reduction, which still gives wrong results when the global BigFloat precision is low or when BigFloat bounds are more precise than the global setting; cot/sec/csc methods for Interval; and sinpi/cospi with high-precision BigFloat bounds.

🤖 Generated with Claude Code

OlivierHnt and others added 4 commits November 1, 2026 19:32
Any interval at least as wide as π contains a pole of tan and cot, so
the result must be the whole line. The check used > instead of >=, so an
interval of width exactly the upper bound of π, such as [-RU(π), 0],
got a finite result that missed the pole.

Part of JuliaIntervals#790.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
acot and acoth are computed as atan(1/x) and atanh(1/x). Both atan and
atanh are increasing, so the lower bound needs 1/x rounded down and the
upper bound needs 1/x rounded up. The two directions were swapped, so
some results excluded the true value.

Part of JuliaIntervals#790.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
acoth is defined for |x| > 1, so its result on an interval is the range
over the part of the interval outside [-1, 1]. Intervals such as
[0.5, 2] returned the empty set instead of [acoth(2), Inf), and
intervals such as [-1, 2] returned the whole line although -1 is not in
the domain. The tests that recorded the empty set are updated.

Part of JuliaIntervals#790.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The interval enclosures of π, γ, catalan, ℯ and φ were computed at the
current BigFloat precision. They are cached on first use, so a low
precision at that moment, for example setprecision(BigFloat, 20), gave a
loose Float64 π for the rest of the session. sin and cos rely on the
tightest π and then returned wrong results.

Part of JuliaIntervals#790.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark Results (Julia v1)

Time benchmarks
master 7e6c96a... master / 7e6c96a...
BigFloat MPFI/basics/* 14.8 ± 2.9 μs 14.7 ± 3.1 μs 1.01 ± 0.29
BigFloat MPFI/basics/+ 9.22 ± 2.9 μs 9.34 ± 3 μs 0.988 ± 0.44
BigFloat MPFI/basics/- 9.03 ± 3.1 μs 9.22 ± 3.2 μs 0.979 ± 0.47
BigFloat MPFI/basics// 16.8 ± 5.3 μs 17 ± 5.9 μs 0.988 ± 0.46
BigFloat MPFI/basics/abs 6.54 ± 2.9 μs 7.02 ± 2.7 μs 0.932 ± 0.54
BigFloat MPFI/basics/acos 0.447 ± 0.0079 ms 0.449 ± 0.012 ms 0.994 ± 0.032
BigFloat MPFI/basics/asin 0.444 ± 0.0079 ms 0.448 ± 0.015 ms 0.991 ± 0.038
BigFloat MPFI/basics/atan 1.41 ± 0.025 ms 1.41 ± 0.019 ms 1 ± 0.022
BigFloat MPFI/basics/cos 0.17 ± 0.005 ms 0.173 ± 0.005 ms 0.983 ± 0.041
BigFloat MPFI/basics/cosh 0.314 ± 0.0086 ms 0.316 ± 0.0087 ms 0.994 ± 0.039
BigFloat MPFI/basics/exp 0.367 ± 0.01 ms 0.367 ± 0.01 ms 1 ± 0.04
BigFloat MPFI/basics/inv 11.5 ± 2.9 μs 11.2 ± 3.1 μs 1.03 ± 0.39
BigFloat MPFI/basics/log 0.319 ± 0.0066 ms 0.316 ± 0.0066 ms 1.01 ± 0.03
BigFloat MPFI/basics/sin 0.242 ± 0.0052 ms 0.241 ± 0.0064 ms 1 ± 0.034
BigFloat MPFI/basics/sinh 0.424 ± 0.012 ms 0.42 ± 0.0082 ms 1.01 ± 0.034
BigFloat MPFI/basics/sqrt 17.1 ± 3 μs 17.4 ± 3.3 μs 0.987 ± 0.25
BigFloat MPFI/basics/tan 0.198 ± 0.0044 ms 0.196 ± 0.0056 ms 1.01 ± 0.037
BigFloat MPFI/basics/tanh 0.427 ± 0.011 ms 0.432 ± 0.0087 ms 0.988 ± 0.033
BigFloat bareinterval/basics/* 28.1 ± 2.4 μs 27.8 ± 2.8 μs 1.01 ± 0.13
BigFloat bareinterval/basics/+ 16.5 ± 2.9 μs 16.9 ± 2.9 μs 0.971 ± 0.24
BigFloat bareinterval/basics/- 16.8 ± 2.9 μs 16.7 ± 2.8 μs 1.01 ± 0.24
BigFloat bareinterval/basics// 13.5 ± 4.3 μs 13.3 ± 4.2 μs 1.01 ± 0.46
BigFloat bareinterval/basics/abs 11.6 ± 2.9 μs 11.2 ± 2.7 μs 1.04 ± 0.36
BigFloat bareinterval/basics/acos 0.461 ± 0.013 ms 0.469 ± 0.008 ms 0.981 ± 0.033
BigFloat bareinterval/basics/asin 0.454 ± 0.017 ms 0.458 ± 0.0088 ms 0.991 ± 0.042
BigFloat bareinterval/basics/atan 1.4 ± 0.014 ms 1.38 ± 0.019 ms 1.01 ± 0.017
BigFloat bareinterval/basics/cos 0.313 ± 0.078 ms 0.31 ± 0.075 ms 1.01 ± 0.35
BigFloat bareinterval/basics/cosh 0.344 ± 0.0074 ms 0.347 ± 0.0073 ms 0.992 ± 0.03
BigFloat bareinterval/basics/exp 0.369 ± 0.011 ms 0.366 ± 0.0098 ms 1.01 ± 0.04
BigFloat bareinterval/basics/inv 18.3 ± 2.7 μs 18.4 ± 2.7 μs 0.998 ± 0.21
BigFloat bareinterval/basics/log 0.338 ± 0.0094 ms 0.34 ± 0.0078 ms 0.993 ± 0.036
BigFloat bareinterval/basics/sin 0.401 ± 0.077 ms 0.405 ± 0.078 ms 0.99 ± 0.27
BigFloat bareinterval/basics/sinh 0.417 ± 0.01 ms 0.424 ± 0.013 ms 0.984 ± 0.04
BigFloat bareinterval/basics/sqrt 23.1 ± 2.2 μs 23.2 ± 1.9 μs 0.998 ± 0.12
BigFloat bareinterval/basics/tan 0.243 ± 0.047 ms 0.241 ± 0.041 ms 1.01 ± 0.26
BigFloat bareinterval/basics/tanh 0.435 ± 0.014 ms 0.428 ± 0.0089 ms 1.02 ± 0.039
BigFloat interval/basics/* 29.2 ± 11 μs 28.5 ± 10 μs 1.02 ± 0.53
BigFloat interval/basics/+ 16.7 ± 7.2 μs 16.9 ± 7.6 μs 0.991 ± 0.62
BigFloat interval/basics/- 11.3 ± 0.54 μs 11.4 ± 0.91 μs 0.992 ± 0.092
BigFloat interval/basics// 12.5 ± 0.41 μs 12.5 ± 0.39 μs 1 ± 0.045
BigFloat interval/basics/abs 11.4 ± 6.6 μs 11.2 ± 6.2 μs 1.01 ± 0.81
BigFloat interval/basics/acos 0.467 ± 0.026 ms 0.461 ± 0.021 ms 1.01 ± 0.074
BigFloat interval/basics/asin 0.452 ± 0.01 ms 0.449 ± 0.01 ms 1.01 ± 0.032
BigFloat interval/basics/atan 1.39 ± 0.019 ms 1.38 ± 0.018 ms 1.01 ± 0.019
BigFloat interval/basics/cos 0.241 ± 0.011 ms 0.235 ± 0.0063 ms 1.02 ± 0.056
BigFloat interval/basics/cosh 0.331 ± 0.009 ms 0.332 ± 0.011 ms 0.997 ± 0.042
BigFloat interval/basics/exp 0.368 ± 0.0066 ms 0.362 ± 0.0074 ms 1.02 ± 0.027
BigFloat interval/basics/inv 14.2 ± 0.47 μs 13.9 ± 0.51 μs 1.02 ± 0.05
BigFloat interval/basics/log 0.333 ± 0.028 ms 0.334 ± 0.02 ms 0.997 ± 0.1
BigFloat interval/basics/sin 0.338 ± 0.015 ms 0.333 ± 0.0078 ms 1.01 ± 0.05
BigFloat interval/basics/sinh 0.426 ± 0.0077 ms 0.424 ± 0.009 ms 1 ± 0.028
BigFloat interval/basics/sqrt 24.6 ± 24 μs 24.6 ± 23 μs 1 ± 1.4
BigFloat interval/basics/tan 0.201 ± 0.0041 ms 0.197 ± 0.005 ms 1.02 ± 0.033
BigFloat interval/basics/tanh 0.432 ± 0.0083 ms 0.429 ± 0.014 ms 1.01 ± 0.038
bareinterval/basics/* 1.1 ± 0.069 μs 1.09 ± 0.06 μs 1.01 ± 0.084
bareinterval/basics/+ 0.38 ± 0.01 μs 0.37 ± 0.01 μs 1.03 ± 0.039
bareinterval/basics/- 0.39 ± 0.01 μs 0.371 ± 0.011 μs 1.05 ± 0.041
bareinterval/basics// 0.821 ± 0.039 μs 0.821 ± 0.04 μs 1 ± 0.068
bareinterval/basics/abs 0.08 ± 0 μs 0.08 ± 0.01 μs 1 ± 0.12
bareinterval/basics/acos 1.6 ± 0.02 μs 1.61 ± 0.01 μs 0.994 ± 0.014
bareinterval/basics/asin 1.74 ± 0.01 μs 1.77 ± 0.01 μs 0.983 ± 0.0079
bareinterval/basics/atan 5.94 ± 0.05 μs 5.72 ± 0.041 μs 1.04 ± 0.011
bareinterval/basics/cos 0.0617 ± 0.0082 ms 0.0631 ± 0.018 ms 0.979 ± 0.3
bareinterval/basics/cosh 4.14 ± 0.059 μs 4.11 ± 0.03 μs 1.01 ± 0.016
bareinterval/basics/exp 2.05 ± 0.01 μs 2.06 ± 0.01 μs 0.995 ± 0.0068
bareinterval/basics/inv 0.581 ± 0.01 μs 0.601 ± 0.01 μs 0.967 ± 0.023
bareinterval/basics/log 9.71 ± 0.11 μs 9.68 ± 0.081 μs 1 ± 0.014
bareinterval/basics/sin 0.0618 ± 0.011 ms 0.0623 ± 0.017 ms 0.992 ± 0.32
bareinterval/basics/sinh 5.36 ± 0.12 μs 5.29 ± 0.02 μs 1.01 ± 0.023
bareinterval/basics/sqrt 0.611 ± 0.01 μs 0.621 ± 0.01 μs 0.984 ± 0.023
bareinterval/basics/tan 0.0342 ± 0.0035 ms 0.0344 ± 0.0035 ms 0.995 ± 0.14
bareinterval/basics/tanh 0.201 ± 0.0091 ms 0.2 ± 0.0062 ms 1.01 ± 0.055
interval/basics/* 1.57 ± 0.079 μs 1.53 ± 0.08 μs 1.03 ± 0.074
interval/basics/+ 0.952 ± 0.25 μs 0.921 ± 0.04 μs 1.03 ± 0.28
interval/basics/- 0.941 ± 0.02 μs 0.972 ± 0.021 μs 0.968 ± 0.029
interval/basics// 1.17 ± 1.3 μs 1.27 ± 1.4 μs 0.921 ± 1.4
interval/basics/abs 0.221 ± 0.069 μs 0.221 ± 0.031 μs 1 ± 0.34
interval/basics/acos 1.94 ± 0.04 μs 1.95 ± 0.02 μs 0.995 ± 0.023
interval/basics/asin 2.11 ± 0.03 μs 2.1 ± 0.02 μs 1 ± 0.017
interval/basics/atan 6.2 ± 0.051 μs 6.19 ± 0.05 μs 1 ± 0.012
interval/basics/cos 0.0618 ± 0.025 ms 0.0615 ± 0.024 ms 1 ± 0.57
interval/basics/cosh 4.78 ± 0.031 μs 4.72 ± 0.05 μs 1.01 ± 0.013
interval/basics/exp 2.56 ± 0.03 μs 2.63 ± 0.04 μs 0.974 ± 0.019
interval/basics/inv 1.01 ± 0.02 μs 1.02 ± 0.03 μs 0.989 ± 0.035
interval/basics/log 12.7 ± 0.18 μs 9.62 ± 0.061 μs 1.32 ± 0.021
interval/basics/sin 0.0617 ± 0.024 ms 0.0623 ± 0.023 ms 0.99 ± 0.54
interval/basics/sinh 5.84 ± 0.04 μs 5.76 ± 0.051 μs 1.01 ± 0.011
interval/basics/sqrt 0.972 ± 0.04 μs 0.962 ± 0.049 μs 1.01 ± 0.066
interval/basics/tan 0.034 ± 0.0029 ms 0.0343 ± 0.003 ms 0.989 ± 0.12
interval/basics/tanh 0.197 ± 0.011 ms 0.198 ± 0.0094 ms 0.993 ± 0.072
time_to_load 0.0742 ± 0.0019 s 0.0768 ± 0.0045 s 0.967 ± 0.062
Memory benchmarks
master 7e6c96a... master / 7e6c96a...
BigFloat MPFI/basics/* 0.332 k allocs: 17.7 kB 0.332 k allocs: 17.7 kB 1
BigFloat MPFI/basics/+ 0.302 k allocs: 16.5 kB 0.302 k allocs: 16.5 kB 1
BigFloat MPFI/basics/- 0.302 k allocs: 16.5 kB 0.302 k allocs: 16.5 kB 1
BigFloat MPFI/basics// 0.302 k allocs: 16.5 kB 0.302 k allocs: 16.5 kB 1
BigFloat MPFI/basics/abs 0.302 k allocs: 16.5 kB 0.302 k allocs: 16.5 kB 1
BigFloat MPFI/basics/acos 1.14 k allocs: 0.0407 MB 1.14 k allocs: 0.0407 MB 1
BigFloat MPFI/basics/asin 1.08 k allocs: 0.0417 MB 1.08 k allocs: 0.0417 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 1.56 k allocs: 0.0425 MB 1.56 k allocs: 0.0425 MB 1
BigFloat MPFI/basics/cosh 0.759 k allocs: 0.0313 MB 0.759 k allocs: 0.0313 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.302 k allocs: 16.5 kB 0.302 k allocs: 16.5 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 1.91 k allocs: 0.0536 MB 1.91 k allocs: 0.0536 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 1.65 k allocs: 0.0493 MB 1.65 k allocs: 0.0492 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.27 k allocs: 0.0692 MB 1.27 k allocs: 0.0692 MB 1
BigFloat bareinterval/basics/asin 1.17 k allocs: 0.0659 MB 1.17 k allocs: 0.0659 MB 1
BigFloat bareinterval/basics/atan 2.04 k allocs: 0.058 MB 2.04 k allocs: 0.058 MB 1
BigFloat bareinterval/basics/cos 2.58 k allocs: 0.196 MB 2.58 k allocs: 0.196 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.616 k allocs: 0.0522 MB 0.616 k allocs: 0.0522 MB 1
BigFloat bareinterval/basics/sin 3.02 k allocs: 0.209 MB 3.02 k allocs: 0.209 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.26 k allocs: 25.8 kB 0.26 k allocs: 25.8 kB 1
BigFloat bareinterval/basics/tan 1.73 k allocs: 0.129 MB 1.73 k allocs: 0.129 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.71 k allocs: 0.11 MB 1.71 k allocs: 0.11 MB 0.997
BigFloat interval/basics/asin 1.47 k allocs: 0.0943 MB 1.47 k allocs: 0.0945 MB 0.998
BigFloat interval/basics/atan 2.04 k allocs: 0.0594 MB 2.04 k allocs: 0.0594 MB 0.999
BigFloat interval/basics/cos 2.58 k allocs: 0.197 MB 2.58 k allocs: 0.197 MB 1
BigFloat interval/basics/cosh 1.01 k allocs: 0.068 MB 1.01 k allocs: 0.0682 MB 0.998
BigFloat interval/basics/exp 0.803 k allocs: 0.0406 MB 0.803 k allocs: 0.0409 MB 0.994
BigFloat interval/basics/inv 0.199 k allocs: 20.8 kB 0.199 k allocs: 20.8 kB 1
BigFloat interval/basics/log 0.917 k allocs: 0.0805 MB 0.917 k allocs: 0.0805 MB 1
BigFloat interval/basics/sin 3.02 k allocs: 0.209 MB 3.02 k allocs: 0.209 MB 1
BigFloat interval/basics/sinh 0.816 k allocs: 0.0416 MB 0.816 k allocs: 0.0419 MB 0.994
BigFloat interval/basics/sqrt 0.714 k allocs: 0.0675 MB 0.714 k allocs: 0.0675 MB 1
BigFloat interval/basics/tan 1.73 k allocs: 0.13 MB 1.73 k allocs: 0.13 MB 1
BigFloat interval/basics/tanh 0.809 k allocs: 0.0411 MB 0.809 k allocs: 0.041 MB 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// 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.806 k allocs: 0.0623 MB 0.806 k allocs: 0.0623 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.806 k allocs: 0.0623 MB 0.806 k allocs: 0.0623 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.416 k allocs: 0.0328 MB 0.416 k allocs: 0.0328 MB 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.807 k allocs: 0.0631 MB 0.807 k allocs: 0.0631 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.807 k allocs: 0.0631 MB 0.807 k allocs: 0.0631 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.417 k allocs: 0.0336 MB 0.417 k allocs: 0.0336 MB 1
interval/basics/tanh 1.03 k allocs: 0.0367 MB 1.03 k allocs: 0.0367 MB 1
time_to_load 0.2 k allocs: 11.8 kB 0.2 k allocs: 11.8 kB 1

OlivierHnt and others added 4 commits November 1, 2026 21:14
To find where x lies relative to multiples of π/2, 2x was computed in the
type of x. For |x| > floatmax/2 this overflows to Inf and the functions
threw an error. Now x is converted exactly to BigFloat and doubled
there, which is exact and cannot overflow.

Part of JuliaIntervals#790.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
π was taken with 256 bits to find where x lies relative to multiples of
π/2. For large x this is not enough, and the result could be the whole
range, for example tan(interval(0x1.117203831ce2fp+626)) with a BigFloat
precision of 1000, or tan(interval(0x1.3c0ca428c59fbp+255)) at the
default precision. The number of bits is now the exponent of x plus its
precision plus 64, which is enough for every Float16, Float32 and
Float64.

Part of JuliaIntervals#790.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With set_zero_subnormals(true), tiny results become zero, so for example
exp(interval(-745.0)) gives [0, 0] although exp(-745) > 0. This is a
per-thread processor setting that IntervalArithmetic cannot check
cheaply, so it is documented instead.

Part of JuliaIntervals#790.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The enclosures of π, ℯ and the other constants are cached on first use.
This is fine for Float64 and similar types, whose precision is fixed,
but the bounds of a Rational{BigInt} constant come from a BigFloat at
the current precision. They stayed at the precision of the first call,
like BigFloat used to before it got its own method. Rational{BigInt}
now uses that method too.

Part of JuliaIntervals#790.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@OlivierHnt
OlivierHnt merged commit cdf05f8 into JuliaIntervals:master Nov 1, 2026
22 checks passed
@OlivierHnt
OlivierHnt deleted the fix-790 branch November 1, 2026 13:21
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.

Corner cases bugs

1 participant