Skip to content

Fix parsing of uncertainty (e.g. I"0.03?3") - #786

Open
Kolaru wants to merge 2 commits into
JuliaIntervals:masterfrom
Kolaru:fix_parsing
Open

Kolaru wants to merge 2 commits into
JuliaIntervals:masterfrom
Kolaru:fix_parsing

Conversation

@Kolaru

@Kolaru Kolaru commented Oct 14, 2026

Copy link
Copy Markdown
Member

Fix #785

(I know, I should be reviewing PRs instead, but this one sounded fun 🙈 )

@codecov-commenter

codecov-commenter commented Oct 14, 2026 •

Copy link
Copy Markdown

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

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.16%. Comparing base (6555626) to head (6d7f185).
⚠️ Report is 45 commits behind head on master.
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@             Coverage Diff             @@
##           master     #786       +/-   ##
===========================================
+ Coverage   75.56%   94.16%   +18.60%     
===========================================
  Files          32       33        +1     
  Lines        3131     3241      +110     
===========================================
+ Hits         2366     3052      +686     
+ Misses        765      189      -576     

☔ View full report in Codecov by Harness.
📢 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.

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark Results (Julia v1)

Time benchmarks
master 9a3663c... master / 9a3663c...
BigFloat MPFI/basics/* 18.2 ± 4.6 μs 18.5 ± 7.8 μs 0.987 ± 0.49
BigFloat MPFI/basics/+ 10.5 ± 3 μs 10.3 ± 3 μs 1.02 ± 0.42
BigFloat MPFI/basics/- 10.7 ± 3 μs 10.8 ± 3.4 μs 0.993 ± 0.42
BigFloat MPFI/basics// 18.3 ± 4.7 μs 16.9 ± 3.7 μs 1.08 ± 0.37
BigFloat MPFI/basics/abs 8.93 ± 2.6 μs 8.51 ± 2.7 μs 1.05 ± 0.45
BigFloat MPFI/basics/acos 0.505 ± 0.058 ms 0.479 ± 0.044 ms 1.05 ± 0.16
BigFloat MPFI/basics/asin 0.474 ± 0.051 ms 0.47 ± 0.021 ms 1.01 ± 0.12
BigFloat MPFI/basics/atan 1.48 ± 0.12 ms 1.52 ± 0.19 ms 0.969 ± 0.14
BigFloat MPFI/basics/cos 0.195 ± 0.024 ms 0.198 ± 0.025 ms 0.985 ± 0.17
BigFloat MPFI/basics/cosh 0.347 ± 0.04 ms 0.333 ± 0.037 ms 1.04 ± 0.17
BigFloat MPFI/basics/exp 0.422 ± 0.043 ms 0.388 ± 0.015 ms 1.09 ± 0.12
BigFloat MPFI/basics/inv 14 ± 2.9 μs 13.9 ± 2.9 μs 1.01 ± 0.3
BigFloat MPFI/basics/log 0.346 ± 0.028 ms 0.35 ± 0.046 ms 0.988 ± 0.15
BigFloat MPFI/basics/sin 0.258 ± 0.017 ms 0.267 ± 0.038 ms 0.966 ± 0.15
BigFloat MPFI/basics/sinh 0.455 ± 0.045 ms 0.44 ± 0.014 ms 1.03 ± 0.11
BigFloat MPFI/basics/sqrt 19.1 ± 6.3 μs 19.5 ± 6.3 μs 0.981 ± 0.45
BigFloat MPFI/basics/tan 0.206 ± 0.0084 ms 0.209 ± 0.019 ms 0.987 ± 0.098
BigFloat MPFI/basics/tanh 0.471 ± 0.051 ms 0.453 ± 0.028 ms 1.04 ± 0.13
BigFloat bareinterval/basics/* 30.5 ± 4.9 μs 28.9 ± 2.1 μs 1.05 ± 0.19
BigFloat bareinterval/basics/+ 17.3 ± 3.4 μs 16.1 ± 2.6 μs 1.07 ± 0.27
BigFloat bareinterval/basics/- 16.3 ± 2.6 μs 16.2 ± 2.4 μs 1.01 ± 0.22
BigFloat bareinterval/basics// 15.1 ± 4.5 μs 14.2 ± 2.8 μs 1.06 ± 0.38
BigFloat bareinterval/basics/abs 11.6 ± 2.7 μs 11.4 ± 2.5 μs 1.02 ± 0.33
BigFloat bareinterval/basics/acos 0.491 ± 0.026 ms 0.497 ± 0.035 ms 0.987 ± 0.087
BigFloat bareinterval/basics/asin 0.49 ± 0.031 ms 0.484 ± 0.014 ms 1.01 ± 0.07
BigFloat bareinterval/basics/atan 1.48 ± 0.11 ms 1.48 ± 0.02 ms 1 ± 0.076
BigFloat bareinterval/basics/cos 0.306 ± 0.057 ms 0.306 ± 0.056 ms 1 ± 0.26
BigFloat bareinterval/basics/cosh 0.362 ± 0.017 ms 0.36 ± 0.017 ms 1 ± 0.066
BigFloat bareinterval/basics/exp 0.402 ± 0.032 ms 0.397 ± 0.012 ms 1.01 ± 0.087
BigFloat bareinterval/basics/inv 18.6 ± 2.7 μs 18.3 ± 2.5 μs 1.01 ± 0.2
BigFloat bareinterval/basics/log 0.362 ± 0.02 ms 0.362 ± 0.031 ms 0.998 ± 0.1
BigFloat bareinterval/basics/sin 0.393 ± 0.04 ms 0.407 ± 0.047 ms 0.968 ± 0.15
BigFloat bareinterval/basics/sinh 0.448 ± 0.039 ms 0.451 ± 0.039 ms 0.994 ± 0.12
BigFloat bareinterval/basics/sqrt 24 ± 2.4 μs 23.9 ± 2.3 μs 1.01 ± 0.14
BigFloat bareinterval/basics/tan 0.235 ± 0.034 ms 0.239 ± 0.036 ms 0.985 ± 0.21
BigFloat bareinterval/basics/tanh 0.454 ± 0.036 ms 0.453 ± 0.014 ms 1 ± 0.084
BigFloat interval/basics/* 31.4 ± 8.5 μs 30.5 ± 7.7 μs 1.03 ± 0.38
BigFloat interval/basics/+ 14.8 ± 2 μs 14.3 ± 2.3 μs 1.03 ± 0.22
BigFloat interval/basics/- 15.3 ± 1.4 μs 14.2 ± 1.1 μs 1.07 ± 0.13
BigFloat interval/basics// 16.5 ± 1.7 μs 15.2 ± 0.71 μs 1.09 ± 0.12
BigFloat interval/basics/abs 12 ± 5.5 μs 11.6 ± 5.1 μs 1.03 ± 0.66
BigFloat interval/basics/acos 0.548 ± 0.049 ms 0.513 ± 0.054 ms 1.07 ± 0.15
BigFloat interval/basics/asin 0.534 ± 0.057 ms 0.487 ± 0.027 ms 1.1 ± 0.13
BigFloat interval/basics/atan 1.63 ± 0.18 ms 1.47 ± 0.059 ms 1.11 ± 0.13
BigFloat interval/basics/cos 0.276 ± 0.03 ms 0.258 ± 0.018 ms 1.07 ± 0.14
BigFloat interval/basics/cosh 0.384 ± 0.04 ms 0.362 ± 0.039 ms 1.06 ± 0.16
BigFloat interval/basics/exp 0.441 ± 0.047 ms 0.402 ± 0.036 ms 1.1 ± 0.15
BigFloat interval/basics/inv 17.2 ± 2.2 μs 15.6 ± 0.67 μs 1.1 ± 0.15
BigFloat interval/basics/log 0.388 ± 0.05 ms 0.378 ± 0.045 ms 1.02 ± 0.18
BigFloat interval/basics/sin 0.393 ± 0.042 ms 0.358 ± 0.037 ms 1.1 ± 0.16
BigFloat interval/basics/sinh 0.491 ± 0.055 ms 0.448 ± 0.019 ms 1.1 ± 0.13
BigFloat interval/basics/sqrt 31 ± 5.1 μs 29.8 ± 5.2 μs 1.04 ± 0.25
BigFloat interval/basics/tan 0.23 ± 0.021 ms 0.211 ± 0.015 ms 1.09 ± 0.12
BigFloat interval/basics/tanh 0.498 ± 0.05 ms 0.454 ± 0.03 ms 1.1 ± 0.13
bareinterval/basics/* 1.42 ± 0.16 μs 1.41 ± 0.14 μs 1.01 ± 0.15
bareinterval/basics/+ 0.536 ± 0.034 μs 0.566 ± 0.014 μs 0.947 ± 0.064
bareinterval/basics/- 0.579 ± 0.018 μs 0.548 ± 0.03 μs 1.06 ± 0.067
bareinterval/basics// 0.866 ± 0.16 μs 0.874 ± 0.17 μs 0.991 ± 0.26
bareinterval/basics/abs 0.177 ± 0.002 μs 0.177 ± 0.002 μs 1 ± 0.016
bareinterval/basics/acos 2.06 ± 0.061 μs 1.86 ± 0.26 μs 1.11 ± 0.15
bareinterval/basics/asin 2.19 ± 0.026 μs 2.19 ± 0.22 μs 1 ± 0.1
bareinterval/basics/atan 5.46 ± 0.23 μs 5.33 ± 0.076 μs 1.03 ± 0.045
bareinterval/basics/cos 0.0463 ± 0.013 ms 0.0422 ± 0.0097 ms 1.1 ± 0.4
bareinterval/basics/cosh 4.22 ± 0.39 μs 4.13 ± 0.093 μs 1.02 ± 0.097
bareinterval/basics/exp 2.49 ± 0.36 μs 2.44 ± 0.33 μs 1.02 ± 0.2
bareinterval/basics/inv 0.629 ± 0.14 μs 0.598 ± 0.15 μs 1.05 ± 0.36
bareinterval/basics/log 1.31 ± 0.12 μs 1.21 ± 0.16 μs 1.08 ± 0.18
bareinterval/basics/sin 0.044 ± 0.012 ms 0.0409 ± 0.011 ms 1.07 ± 0.41
bareinterval/basics/sinh 7.35 ± 0.9 μs 6.62 ± 0.15 μs 1.11 ± 0.14
bareinterval/basics/sqrt 0.762 ± 0.19 μs 0.706 ± 0.15 μs 1.08 ± 0.35
bareinterval/basics/tan 27.3 ± 3.5 μs 25.3 ± 2.5 μs 1.08 ± 0.17
bareinterval/basics/tanh 0.217 ± 0.022 ms 0.211 ± 0.0092 ms 1.03 ± 0.11
interval/basics/* 1.75 ± 0.2 μs 1.65 ± 0.21 μs 1.06 ± 0.18
interval/basics/+ 1.27 ± 0.18 μs 1.16 ± 0.18 μs 1.09 ± 0.23
interval/basics/- 1.19 ± 0.18 μs 1.16 ± 0.24 μs 1.02 ± 0.26
interval/basics// 1.7 ± 1.1 μs 1.39 ± 1 μs 1.22 ± 1.2
interval/basics/abs 0.277 ± 0.087 μs 0.37 ± 0.092 μs 0.749 ± 0.3
interval/basics/acos 2.15 ± 0.14 μs 2.07 ± 0.22 μs 1.04 ± 0.13
interval/basics/asin 2.25 ± 0.092 μs 2.15 ± 0.23 μs 1.04 ± 0.12
interval/basics/atan 6.29 ± 0.34 μs 5.85 ± 0.092 μs 1.08 ± 0.061
interval/basics/cos 0.0379 ± 0.013 ms 0.0362 ± 0.012 ms 1.05 ± 0.5
interval/basics/cosh 5.18 ± 0.53 μs 5.05 ± 0.54 μs 1.03 ± 0.15
interval/basics/exp 3.01 ± 0.23 μs 3 ± 0.26 μs 1.01 ± 0.12
interval/basics/inv 1.05 ± 0.79 μs 0.995 ± 0.36 μs 1.06 ± 0.88
interval/basics/log 1.61 ± 0.091 μs 1.65 ± 0.12 μs 0.978 ± 0.091
interval/basics/sin 0.0449 ± 0.0058 ms 0.0457 ± 0.006 ms 0.983 ± 0.18
interval/basics/sinh 7.21 ± 0.55 μs 8.04 ± 0.45 μs 0.896 ± 0.085
interval/basics/sqrt 1.11 ± 0.22 μs 1.12 ± 0.36 μs 0.991 ± 0.37
interval/basics/tan 27.2 ± 3.6 μs 26.2 ± 2.5 μs 1.04 ± 0.17
interval/basics/tanh 0.216 ± 0.019 ms 0.211 ± 0.016 ms 1.02 ± 0.12
time_to_load 0.0802 ± 0.0046 s 0.0856 ± 0.0025 s 0.938 ± 0.06
Memory benchmarks
master 9a3663c... master / 9a3663c...
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.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.616 k allocs: 0.0522 MB 0.616 k allocs: 0.0522 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.26 k allocs: 25.8 kB 0.26 k allocs: 25.8 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.71 k allocs: 0.11 MB 1.71 k allocs: 0.11 MB 1
BigFloat interval/basics/asin 1.47 k allocs: 0.0945 MB 1.47 k allocs: 0.0946 MB 0.999
BigFloat interval/basics/atan 2.04 k allocs: 0.0593 MB 2.04 k allocs: 0.0593 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.0682 MB 1.01 k allocs: 0.0681 MB 1
BigFloat interval/basics/exp 0.803 k allocs: 0.0408 MB 0.803 k allocs: 0.0408 MB 1
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 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.0419 MB 1
BigFloat interval/basics/sqrt 0.714 k allocs: 0.0675 MB 0.714 k allocs: 0.0675 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.041 MB 0.809 k allocs: 0.041 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.1 kB 0.29 k allocs: 23.1 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 kB 0.291 k allocs: 24 kB 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

@Kolaru

Kolaru commented Oct 14, 2026 •

Copy link
Copy Markdown
Member Author

Erratum: it seemed fun until I hit a bug on 32 bits machine only x_x

Edit: it was nothing serious.

@OlivierHnt

Copy link
Copy Markdown
Member

Your strategy is to use Rational{BigInt} ?Does this then rely on rationalize or a float conversion?

@Kolaru

Kolaru commented Oct 14, 2026 •

Copy link
Copy Markdown
Member Author

No, there is no call to rationalize, as I build the Rational by hand.

It only relies on converting rationals to floats.

@OlivierHnt

Copy link
Copy Markdown
Member

right; so there are some issues with this for edge cases I think. But anyways we were probably relying on this before?

I am preparing an issue to keep track of these

@Kolaru

Kolaru commented Oct 15, 2026

Copy link
Copy Markdown
Member Author

If we cannot trust the conversion itself, I can reimplement it as

blo = /(BigFloat(lo.num), BigFloat(lo.den), RoundDown)
bhi = /(BigFloat(hi.num), BigFloat(hi.den), RoundUp)
return interval(Float64(blo, RoundDown), Float64(bhi, RoundUp))

where hi and lo are the higher and lower bound computed as Rational{BigInt}. The conversion to BigFloat should be exact, and we trust the rounding of the division.

@OlivierHnt

Copy link
Copy Markdown
Member

@OlivierHnt

OlivierHnt commented Nov 1, 2026 •

Copy link
Copy Markdown
Member

Sorry for the delay @Kolaru. I do not know if you looked at the message I linked, but the bottom line is that Base's directed conversions from Rational to floats can round the wrong way.

Also we messed up a fix in Julia... Base's BigFloat(::Rational, r), rounds negative values the wrong way on Julia 1.12 and later 🤦‍♂️ how embarrassing... I'll open a PR.

So I suggest doing the following before merging this PR (if T = BigFloat the result has the current precision(BigFloat), for other T the global precision has no effect)

function _bigfloat(x::Rational, r::RoundingMode; precision::Integer = Base.precision(BigFloat))
    num, den = numerator(x), denominator(x)
    n = BigFloat(num; precision = ndigits(num; base = 2))
    d = BigFloat(den; precision = ndigits(den; base = 2))
    z = BigFloat(; precision)
    ccall((:mpfr_div, Base.MPFR.libmpfr), Int32,
          (Ref{BigFloat}, Ref{BigFloat}, Ref{BigFloat}, Base.MPFR.MPFRRoundingMode), z, n, d, r)
    return z
end

_round_rational(::Type{BigFloat}, q::Rational, r::RoundingMode) = _bigfloat(q, r)
_round_rational(::Type{T}, q::Rational, r::RoundingMode) where {T<:AbstractFloat} =
    T(_bigfloat(q, r; precision = precision(T)), r)

This branch has not been deployed

No deployments
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.

Uncertain decimal literal 0.03?3 loses its exact zero endpoint

3 participants