Skip to content

Add :ulp rounding mode based on prevfloat and nextfloat#744

Merged
OlivierHnt merged 3 commits intoJuliaIntervals:masterfrom
OlivierHnt:core-math
Mar 30, 2026
Merged

Add :ulp rounding mode based on prevfloat and nextfloat#744
OlivierHnt merged 3 commits intoJuliaIntervals:masterfrom
OlivierHnt:core-math

Conversation

@OlivierHnt
Copy link
Copy Markdown
Member

@OlivierHnt OlivierHnt commented Feb 20, 2026

This PR introduces the :ulp rounding mode, which uses the CORE-MATH functions as much as possible (fallback on MPFR as for the :correct rounding mode).

The motivation is to be able to opt for a faster rounding mode (at the cost of accuracy), and to be GPU compatible.

@OlivierHnt OlivierHnt marked this pull request as draft February 20, 2026 11:38
@OlivierHnt OlivierHnt marked this pull request as ready for review February 20, 2026 18:59
@OlivierHnt OlivierHnt linked an issue Mar 1, 2026 that may be closed by this pull request
@Kolaru Kolaru closed this Mar 3, 2026
@Kolaru Kolaru reopened this Mar 3, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 3, 2026

Benchmark Results (Julia v1)

Time benchmarks
master 42bb7df... master / 42bb7df...
BigFloat MPFI/basics/* 25.6 ± 3.6 μs 25.4 ± 3.7 μs 1.01 ± 0.21
BigFloat MPFI/basics/+ 12.8 ± 3.5 μs 12.7 ± 3.5 μs 1.01 ± 0.39
BigFloat MPFI/basics/- 17.7 ± 3.6 μs 17.9 ± 3.5 μs 0.99 ± 0.28
BigFloat MPFI/basics// 19.4 ± 3.8 μs 19.5 ± 3.6 μs 0.994 ± 0.26
BigFloat MPFI/basics/abs 10.4 ± 3.5 μs 10.5 ± 3.4 μs 0.996 ± 0.47
BigFloat MPFI/basics/acos 0.681 ± 0.01 ms 0.679 ± 0.01 ms 1 ± 0.021
BigFloat MPFI/basics/asin 0.66 ± 0.012 ms 0.664 ± 0.012 ms 0.994 ± 0.025
BigFloat MPFI/basics/atan 2.1 ± 0.0097 ms 2.1 ± 0.0086 ms 1 ± 0.0062
BigFloat MPFI/basics/cos 0.364 ± 0.011 ms 0.362 ± 0.011 ms 1.01 ± 0.044
BigFloat MPFI/basics/cosh 0.431 ± 0.013 ms 0.431 ± 0.012 ms 1 ± 0.04
BigFloat MPFI/basics/exp 0.501 ± 0.012 ms 0.503 ± 0.012 ms 0.996 ± 0.033
BigFloat MPFI/basics/inv 20 ± 3.5 μs 19.8 ± 3.6 μs 1.01 ± 0.26
BigFloat MPFI/basics/log 0.471 ± 0.011 ms 0.472 ± 0.012 ms 0.998 ± 0.035
BigFloat MPFI/basics/sin 0.469 ± 0.013 ms 0.472 ± 0.013 ms 0.993 ± 0.038
BigFloat MPFI/basics/sinh 0.574 ± 0.011 ms 0.575 ± 0.011 ms 0.999 ± 0.027
BigFloat MPFI/basics/sqrt 27.8 ± 6.4 μs 27.7 ± 6.8 μs 1.01 ± 0.34
BigFloat MPFI/basics/tan 0.389 ± 0.012 ms 0.388 ± 0.012 ms 1 ± 0.042
BigFloat MPFI/basics/tanh 0.584 ± 0.012 ms 0.585 ± 0.012 ms 0.999 ± 0.028
BigFloat bareinterval/basics/* 0.0433 ± 0.0023 ms 0.0425 ± 0.0026 ms 1.02 ± 0.082
BigFloat bareinterval/basics/+ 23.4 ± 3.4 μs 22.9 ± 3.4 μs 1.02 ± 0.21
BigFloat bareinterval/basics/- 23.9 ± 3.3 μs 23.8 ± 3.5 μs 1 ± 0.2
BigFloat bareinterval/basics// 20.4 ± 5 μs 20.6 ± 5 μs 0.99 ± 0.34
BigFloat bareinterval/basics/abs 15.5 ± 3.3 μs 15.6 ± 3.3 μs 0.993 ± 0.29
BigFloat bareinterval/basics/acos 0.718 ± 0.023 ms 0.717 ± 0.024 ms 1 ± 0.046
BigFloat bareinterval/basics/asin 0.698 ± 0.023 ms 0.698 ± 0.023 ms 1 ± 0.047
BigFloat bareinterval/basics/atan 2.11 ± 0.0088 ms 2.12 ± 0.0095 ms 0.998 ± 0.0061
BigFloat bareinterval/basics/cos 0.344 ± 0.085 ms 0.347 ± 0.086 ms 0.991 ± 0.35
BigFloat bareinterval/basics/cosh 0.47 ± 0.025 ms 0.473 ± 0.025 ms 0.995 ± 0.074
BigFloat bareinterval/basics/exp 0.507 ± 0.011 ms 0.518 ± 0.013 ms 0.978 ± 0.033
BigFloat bareinterval/basics/inv 24.9 ± 3.2 μs 27.1 ± 3.3 μs 0.918 ± 0.16
BigFloat bareinterval/basics/log 0.515 ± 0.03 ms 0.517 ± 0.03 ms 0.996 ± 0.081
BigFloat bareinterval/basics/sin 0.48 ± 0.091 ms 0.482 ± 0.092 ms 0.998 ± 0.27
BigFloat bareinterval/basics/sinh 0.579 ± 0.012 ms 0.583 ± 0.012 ms 0.994 ± 0.028
BigFloat bareinterval/basics/sqrt 0.0369 ± 0.003 ms 0.0359 ± 0.003 ms 1.03 ± 0.12
BigFloat bareinterval/basics/tan 0.328 ± 0.057 ms 0.329 ± 0.057 ms 0.997 ± 0.24
BigFloat bareinterval/basics/tanh 0.595 ± 0.011 ms 0.595 ± 0.012 ms 1 ± 0.027
BigFloat interval/basics/* 0.0468 ± 0.002 ms 0.0472 ± 0.002 ms 0.992 ± 0.059
BigFloat interval/basics/+ 25.9 ± 8.3 μs 26 ± 8.2 μs 0.995 ± 0.45
BigFloat interval/basics/- 26.6 ± 8.8 μs 26.2 ± 8.4 μs 1.02 ± 0.47
BigFloat interval/basics// 25.3 ± 4.9 μs 25.2 ± 4.8 μs 1 ± 0.27
BigFloat interval/basics/abs 15 ± 7.8 μs 14.9 ± 7.8 μs 1 ± 0.74
BigFloat interval/basics/acos 0.711 ± 0.047 ms 0.711 ± 0.044 ms 0.999 ± 0.091
BigFloat interval/basics/asin 0.692 ± 0.038 ms 0.693 ± 0.038 ms 0.999 ± 0.077
BigFloat interval/basics/atan 2.11 ± 0.0067 ms 2.12 ± 0.0083 ms 0.996 ± 0.005
BigFloat interval/basics/cos 0.339 ± 0.018 ms 0.341 ± 0.016 ms 0.993 ± 0.069
BigFloat interval/basics/cosh 0.466 ± 0.023 ms 0.47 ± 0.023 ms 0.992 ± 0.069
BigFloat interval/basics/exp 0.518 ± 0.011 ms 0.521 ± 0.011 ms 0.995 ± 0.03
BigFloat interval/basics/inv 29.9 ± 7.6 μs 0.0318 ± 0.0078 ms 0.942 ± 0.33
BigFloat interval/basics/log 0.511 ± 0.045 ms 0.515 ± 0.044 ms 0.993 ± 0.12
BigFloat interval/basics/sin 0.488 ± 0.024 ms 0.489 ± 0.023 ms 0.997 ± 0.067
BigFloat interval/basics/sinh 0.589 ± 0.011 ms 0.591 ± 0.012 ms 0.997 ± 0.027
BigFloat interval/basics/sqrt 0.0428 ± 0.031 ms 0.0428 ± 0.031 ms 1 ± 1
BigFloat interval/basics/tan 0.284 ± 0.018 ms 0.284 ± 0.018 ms 0.997 ± 0.089
BigFloat interval/basics/tanh 0.604 ± 0.011 ms 0.603 ± 0.012 ms 1 ± 0.027
bareinterval/basics/* 2.01 ± 0.05 μs 1.97 ± 0.04 μs 1.02 ± 0.033
bareinterval/basics/+ 0.541 ± 0.01 μs 0.541 ± 0.01 μs 1 ± 0.026
bareinterval/basics/- 0.561 ± 0.001 μs 0.551 ± 0.011 μs 1.02 ± 0.02
bareinterval/basics// 1.24 ± 0.02 μs 1.23 ± 0.029 μs 1.01 ± 0.029
bareinterval/basics/abs 0.22 ± 0.01 μs 0.22 ± 0.001 μs 1 ± 0.046
bareinterval/basics/acos 2.89 ± 0.031 μs 2.89 ± 0.031 μs 1 ± 0.015
bareinterval/basics/asin 3.15 ± 0.03 μs 3.18 ± 0.031 μs 0.991 ± 0.014
bareinterval/basics/atan 12.9 ± 0.2 μs 13 ± 0.21 μs 0.991 ± 0.022
bareinterval/basics/cos 0.0502 ± 0.0027 ms 0.0512 ± 0.0069 ms 0.981 ± 0.14
bareinterval/basics/cosh 7.26 ± 0.04 μs 7.26 ± 0.04 μs 1 ± 0.0078
bareinterval/basics/exp 4.3 ± 0.04 μs 4.29 ± 0.05 μs 1 ± 0.015
bareinterval/basics/inv 1.06 ± 0.02 μs 1.07 ± 0.03 μs 0.991 ± 0.033
bareinterval/basics/log 2.11 ± 0.06 μs 2.11 ± 0.02 μs 1 ± 0.03
bareinterval/basics/sin 0.0492 ± 0.019 ms 0.0503 ± 0.018 ms 0.978 ± 0.51
bareinterval/basics/sinh 9.97 ± 0.06 μs 9.99 ± 0.06 μs 0.998 ± 0.0085
bareinterval/basics/sqrt 1.18 ± 0.02 μs 1.18 ± 0.02 μs 1 ± 0.024
bareinterval/basics/tan 29.1 ± 0.33 μs 29.2 ± 0.37 μs 0.995 ± 0.017
bareinterval/basics/tanh 0.295 ± 0.0093 ms 0.295 ± 0.01 ms 1 ± 0.047
interval/basics/* 3.42 ± 0.079 μs 3.2 ± 0.07 μs 1.07 ± 0.034
interval/basics/+ 1.65 ± 0.07 μs 1.49 ± 0.081 μs 1.11 ± 0.076
interval/basics/- 1.68 ± 0.071 μs 1.53 ± 0.08 μs 1.1 ± 0.074
interval/basics// 2.65 ± 0.06 μs 2.48 ± 0.07 μs 1.07 ± 0.039
interval/basics/abs 0.942 ± 0.14 μs 0.952 ± 0.15 μs 0.989 ± 0.21
interval/basics/acos 5.21 ± 0.079 μs 5.01 ± 0.08 μs 1.04 ± 0.023
interval/basics/asin 5.3 ± 0.07 μs 5.17 ± 0.069 μs 1.02 ± 0.019
interval/basics/atan 14.7 ± 0.19 μs 14.6 ± 0.19 μs 1.01 ± 0.019
interval/basics/cos 0.0679 ± 0.019 ms 0.07 ± 0.019 ms 0.971 ± 0.39
interval/basics/cosh 10.3 ± 0.079 μs 10.3 ± 0.071 μs 1 ± 0.01
interval/basics/exp 6.64 ± 0.091 μs 6.83 ± 0.11 μs 0.972 ± 0.021
interval/basics/inv 2.04 ± 0.06 μs 2.07 ± 0.09 μs 0.986 ± 0.052
interval/basics/log 5.05 ± 0.06 μs 4.94 ± 0.06 μs 1.02 ± 0.017
interval/basics/sin 0.0677 ± 0.02 ms 0.0679 ± 0.02 ms 0.997 ± 0.41
interval/basics/sinh 13.3 ± 0.08 μs 13.2 ± 0.079 μs 1.01 ± 0.0086
interval/basics/sqrt 2.13 ± 0.081 μs 3.4 ± 1.2 μs 0.628 ± 0.22
interval/basics/tan 0.0391 ± 0.0019 ms 0.0394 ± 0.0019 ms 0.992 ± 0.067
interval/basics/tanh 0.306 ± 0.0069 ms 0.309 ± 0.0069 ms 0.993 ± 0.032
time_to_load 0.107 ± 0.00074 s 0.109 ± 0.002 s 0.982 ± 0.019
Memory benchmarks
master 42bb7df... master / 42bb7df...
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.0932 MB 1.53 k allocs: 0.0932 MB 1
BigFloat interval/basics/atan 2.04 k allocs: 0.0812 MB 2.04 k allocs: 0.0812 MB 1
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.0409 MB 0.803 k allocs: 0.041 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.042 MB 0.816 k allocs: 0.0418 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.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.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.154 k allocs: 11.4 kB 0.963

@OlivierHnt OlivierHnt merged commit bbb8340 into JuliaIntervals:master Mar 30, 2026
22 checks passed
@OlivierHnt OlivierHnt deleted the core-math branch March 30, 2026 01:52
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.

Replacing CRlibm with CORE-MATH

2 participants