Skip to content

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

Open
OlivierHnt wants to merge 2 commits intoJuliaIntervals:masterfrom
OlivierHnt:core-math
Open

Add :ulp rounding mode based on prevfloat and nextfloat#744
OlivierHnt wants to merge 2 commits intoJuliaIntervals:masterfrom
OlivierHnt:core-math

Conversation

@OlivierHnt
Copy link
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
Contributor

github-actions bot commented Mar 3, 2026

Benchmark Results (Julia v1)

Time benchmarks
master 2aa7e54... master / 2aa7e54...
BigFloat MPFI/basics/* 25.3 ± 3.9 μs 25.4 ± 4 μs 0.997 ± 0.22
BigFloat MPFI/basics/+ 12.5 ± 4 μs 12.6 ± 3.9 μs 0.987 ± 0.44
BigFloat MPFI/basics/- 17.2 ± 4.9 μs 17.5 ± 4.1 μs 0.982 ± 0.36
BigFloat MPFI/basics// 19.6 ± 3.9 μs 20.1 ± 4.3 μs 0.973 ± 0.29
BigFloat MPFI/basics/abs 10.6 ± 3.9 μs 10.3 ± 3.9 μs 1.02 ± 0.54
BigFloat MPFI/basics/acos 0.667 ± 0.0095 ms 0.666 ± 0.0087 ms 1 ± 0.019
BigFloat MPFI/basics/asin 0.647 ± 0.0098 ms 0.662 ± 0.0089 ms 0.977 ± 0.02
BigFloat MPFI/basics/atan 2.07 ± 0.022 ms 2.08 ± 0.014 ms 0.997 ± 0.013
BigFloat MPFI/basics/cos 0.354 ± 0.0091 ms 0.353 ± 0.0091 ms 1 ± 0.036
BigFloat MPFI/basics/cosh 0.423 ± 0.011 ms 0.425 ± 0.012 ms 0.996 ± 0.038
BigFloat MPFI/basics/exp 0.497 ± 0.01 ms 0.496 ± 0.011 ms 1 ± 0.03
BigFloat MPFI/basics/inv 19.1 ± 3.9 μs 18.9 ± 4 μs 1.01 ± 0.29
BigFloat MPFI/basics/log 0.469 ± 0.0088 ms 0.465 ± 0.0088 ms 1.01 ± 0.027
BigFloat MPFI/basics/sin 0.457 ± 0.01 ms 0.456 ± 0.01 ms 1 ± 0.031
BigFloat MPFI/basics/sinh 0.564 ± 0.0095 ms 0.565 ± 0.0098 ms 0.999 ± 0.024
BigFloat MPFI/basics/sqrt 28.2 ± 7.5 μs 28.2 ± 7.4 μs 0.999 ± 0.37
BigFloat MPFI/basics/tan 0.38 ± 0.0095 ms 0.379 ± 0.0094 ms 1 ± 0.035
BigFloat MPFI/basics/tanh 0.576 ± 0.01 ms 0.576 ± 0.011 ms 0.999 ± 0.026
BigFloat bareinterval/basics/* 0.0437 ± 0.0033 ms 0.149 ± 0.085 ms 0.292 ± 0.17
BigFloat bareinterval/basics/+ 24.5 ± 3.9 μs 0.0707 ± 0.04 ms 0.347 ± 0.2
BigFloat bareinterval/basics/- 25.6 ± 4 μs 0.0706 ± 0.0068 ms 0.362 ± 0.066
BigFloat bareinterval/basics// 21.2 ± 6 μs 0.085 ± 0.039 ms 0.249 ± 0.13
BigFloat bareinterval/basics/abs 17.6 ± 3.9 μs 0.0855 ± 0.042 ms 0.206 ± 0.11
BigFloat bareinterval/basics/acos 0.712 ± 0.026 ms 0.775 ± 0.075 ms 0.919 ± 0.095
BigFloat bareinterval/basics/asin 0.691 ± 0.024 ms 0.762 ± 0.075 ms 0.906 ± 0.094
BigFloat bareinterval/basics/atan 2.08 ± 0.023 ms 2.13 ± 0.039 ms 0.978 ± 0.021
BigFloat bareinterval/basics/cos 0.336 ± 0.097 ms 0.38 ± 0.097 ms 0.885 ± 0.34
BigFloat bareinterval/basics/cosh 0.465 ± 0.027 ms 0.484 ± 0.069 ms 0.962 ± 0.15
BigFloat bareinterval/basics/exp 0.503 ± 0.01 ms 0.54 ± 0.028 ms 0.931 ± 0.051
BigFloat bareinterval/basics/inv 27.5 ± 4.1 μs 0.0738 ± 0.0045 ms 0.372 ± 0.06
BigFloat bareinterval/basics/log 0.518 ± 0.032 ms 0.562 ± 0.066 ms 0.922 ± 0.12
BigFloat bareinterval/basics/sin 0.469 ± 0.11 ms 0.514 ± 0.19 ms 0.912 ± 0.39
BigFloat bareinterval/basics/sinh 0.571 ± 0.011 ms 0.61 ± 0.03 ms 0.937 ± 0.049
BigFloat bareinterval/basics/sqrt 0.0383 ± 0.0033 ms 0.113 ± 0.0066 ms 0.338 ± 0.035
BigFloat bareinterval/basics/tan 0.331 ± 0.065 ms 0.314 ± 0.12 ms 1.05 ± 0.46
BigFloat bareinterval/basics/tanh 0.586 ± 0.011 ms 0.623 ± 0.03 ms 0.941 ± 0.049
BigFloat interval/basics/* 0.0483 ± 0.003 ms 0.0826 ± 0.1 ms 0.585 ± 0.71
BigFloat interval/basics/+ 27.5 ± 10 μs 0.091 ± 0.055 ms 0.303 ± 0.22
BigFloat interval/basics/- 28 ± 10 μs 0.0529 ± 0.055 ms 0.53 ± 0.58
BigFloat interval/basics// 25.8 ± 5.6 μs 0.0573 ± 0.062 ms 0.449 ± 0.49
BigFloat interval/basics/abs 16.6 ± 9.5 μs 0.0819 ± 0.049 ms 0.202 ± 0.17
BigFloat interval/basics/acos 0.708 ± 0.055 ms 0.741 ± 0.13 ms 0.955 ± 0.18
BigFloat interval/basics/asin 0.683 ± 0.044 ms 0.72 ± 0.051 ms 0.949 ± 0.091
BigFloat interval/basics/atan 2.08 ± 0.0049 ms 2.11 ± 0.049 ms 0.982 ± 0.023
BigFloat interval/basics/cos 0.335 ± 0.015 ms 0.392 ± 0.014 ms 0.854 ± 0.048
BigFloat interval/basics/cosh 0.457 ± 0.026 ms 0.49 ± 0.017 ms 0.933 ± 0.062
BigFloat interval/basics/exp 0.51 ± 0.0099 ms 0.542 ± 0.047 ms 0.942 ± 0.084
BigFloat interval/basics/inv 31.5 ± 5.7 μs 0.107 ± 0.0071 ms 0.295 ± 0.057
BigFloat interval/basics/log 0.506 ± 0.048 ms 0.536 ± 0.1 ms 0.945 ± 0.2
BigFloat interval/basics/sin 0.478 ± 0.026 ms 0.535 ± 0.035 ms 0.893 ± 0.075
BigFloat interval/basics/sinh 0.577 ± 0.01 ms 0.608 ± 0.044 ms 0.949 ± 0.07
BigFloat interval/basics/sqrt 0.0426 ± 0.037 ms 0.0726 ± 0.0035 ms 0.587 ± 0.51
BigFloat interval/basics/tan 0.279 ± 0.015 ms 0.325 ± 0.014 ms 0.857 ± 0.058
BigFloat interval/basics/tanh 0.593 ± 0.013 ms 0.622 ± 0.043 ms 0.953 ± 0.069
bareinterval/basics/* 2.4 ± 0.03 μs 1.96 ± 0.04 μs 1.22 ± 0.029
bareinterval/basics/+ 0.822 ± 0.011 μs 0.531 ± 0.01 μs 1.55 ± 0.036
bareinterval/basics/- 0.752 ± 0.011 μs 0.552 ± 0.01 μs 1.36 ± 0.032
bareinterval/basics// 1.54 ± 0.02 μs 1.22 ± 0.02 μs 1.26 ± 0.026
bareinterval/basics/abs 0.301 ± 0.021 μs 0.29 ± 0.01 μs 1.04 ± 0.081
bareinterval/basics/acos 2.98 ± 0.031 μs 2.93 ± 0.039 μs 1.02 ± 0.017
bareinterval/basics/asin 3.17 ± 0.02 μs 3.15 ± 0.03 μs 1.01 ± 0.012
bareinterval/basics/atan 13.1 ± 0.18 μs 13.3 ± 0.21 μs 0.983 ± 0.021
bareinterval/basics/cos 0.05 ± 0.017 ms 0.0654 ± 0.0015 ms 0.764 ± 0.26
bareinterval/basics/cosh 7.88 ± 0.04 μs 7.26 ± 0.04 μs 1.08 ± 0.0081
bareinterval/basics/exp 4.44 ± 0.039 μs 4.32 ± 0.05 μs 1.03 ± 0.015
bareinterval/basics/inv 1.24 ± 0.04 μs 1.05 ± 0.022 μs 1.18 ± 0.045
bareinterval/basics/log 2.14 ± 0.02 μs 2.17 ± 4.1 μs 0.986 ± 1.9
bareinterval/basics/sin 0.0491 ± 0.021 ms 0.0653 ± 0.054 ms 0.752 ± 0.7
bareinterval/basics/sinh 10.1 ± 0.061 μs 9.99 ± 0.06 μs 1.01 ± 0.0086
bareinterval/basics/sqrt 1.12 ± 0.021 μs 1.35 ± 0.02 μs 0.829 ± 0.02
bareinterval/basics/tan 28.8 ± 0.55 μs 0.0374 ± 0.00071 ms 0.769 ± 0.021
bareinterval/basics/tanh 0.288 ± 0.0084 ms 0.288 ± 0.0084 ms 1 ± 0.041
interval/basics/* 3.86 ± 0.091 μs 3.22 ± 0.08 μs 1.2 ± 0.041
interval/basics/+ 1.84 ± 0.1 μs 1.49 ± 0.091 μs 1.24 ± 0.1
interval/basics/- 1.79 ± 0.12 μs 1.52 ± 0.09 μs 1.18 ± 0.11
interval/basics// 2.83 ± 0.09 μs 2.46 ± 0.079 μs 1.15 ± 0.052
interval/basics/abs 0.932 ± 0.15 μs 0.882 ± 0.11 μs 1.06 ± 0.22
interval/basics/acos 5.06 ± 0.09 μs 5.02 ± 0.061 μs 1.01 ± 0.022
interval/basics/asin 5.16 ± 0.08 μs 5.15 ± 0.07 μs 1 ± 0.021
interval/basics/atan 13 ± 0.23 μs 16.3 ± 1.9 μs 0.795 ± 0.093
interval/basics/cos 0.0708 ± 0.022 ms 0.119 ± 0.054 ms 0.595 ± 0.33
interval/basics/cosh 10.8 ± 0.1 μs 10.3 ± 0.079 μs 1.05 ± 0.013
interval/basics/exp 5.5 ± 0.1 μs 6.66 ± 0.09 μs 0.826 ± 0.019
interval/basics/inv 2.35 ± 0.32 μs 2.04 ± 0.08 μs 1.15 ± 0.16
interval/basics/log 5 ± 0.08 μs 4.94 ± 0.06 μs 1.01 ± 0.02
interval/basics/sin 0.0702 ± 0.022 ms 0.119 ± 0.053 ms 0.591 ± 0.32
interval/basics/sinh 11.4 ± 0.11 μs 13.2 ± 0.08 μs 0.868 ± 0.0099
interval/basics/sqrt 2.14 ± 0.09 μs 2.32 ± 0.11 μs 0.923 ± 0.058
interval/basics/tan 0.0405 ± 0.002 ms 0.0663 ± 0.0039 ms 0.611 ± 0.047
interval/basics/tanh 0.302 ± 0.0078 ms 0.303 ± 0.01 ms 0.997 ± 0.043
time_to_load 0.106 ± 0.0029 s 0.108 ± 0.0026 s 0.985 ± 0.036
Memory benchmarks
master 2aa7e54... master / 2aa7e54...
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 1.71 k allocs: 0.158 MB 0.161
BigFloat bareinterval/basics/+ 0.202 k allocs: 20.4 kB 0.802 k allocs: 0.0748 MB 0.266
BigFloat bareinterval/basics/- 0.202 k allocs: 20.4 kB 0.802 k allocs: 0.0748 MB 0.266
BigFloat bareinterval/basics// 0.1 k allocs: 10.8 kB 0.954 k allocs: 0.0887 MB 0.119
BigFloat bareinterval/basics/abs 0.199 k allocs: 20.1 kB 1.1 k allocs: 0.102 MB 0.192
BigFloat bareinterval/basics/acos 1.33 k allocs: 0.0741 MB 2.2 k allocs: 0.154 MB 0.481
BigFloat bareinterval/basics/asin 1.23 k allocs: 0.0647 MB 2.14 k allocs: 0.149 MB 0.435
BigFloat bareinterval/basics/atan 2.04 k allocs: 0.08 MB 2.44 k allocs: 0.117 MB 0.686
BigFloat bareinterval/basics/cos 2.45 k allocs: 0.185 MB 4.11 k allocs: 0.336 MB 0.55
BigFloat bareinterval/basics/cosh 1.01 k allocs: 0.0671 MB 1.76 k allocs: 0.136 MB 0.494
BigFloat bareinterval/basics/exp 0.802 k allocs: 0.0397 MB 1.2 k allocs: 0.0764 MB 0.52
BigFloat bareinterval/basics/inv 0.198 k allocs: 20 kB 0.8 k allocs: 0.0746 MB 0.262
BigFloat bareinterval/basics/log 0.804 k allocs: 0.0694 MB 1.43 k allocs: 0.127 MB 0.548
BigFloat bareinterval/basics/sin 2.9 k allocs: 0.197 MB 4.55 k allocs: 0.349 MB 0.566
BigFloat bareinterval/basics/sinh 0.815 k allocs: 0.0407 MB 1.22 k allocs: 0.0773 MB 0.526
BigFloat bareinterval/basics/sqrt 0.304 k allocs: 29.9 kB 1.24 k allocs: 0.115 MB 0.255
BigFloat bareinterval/basics/tan 1.67 k allocs: 0.124 MB 2.92 k allocs: 0.238 MB 0.519
BigFloat bareinterval/basics/tanh 0.808 k allocs: 0.0399 MB 1.21 k allocs: 0.0766 MB 0.522
BigFloat interval/basics/* 0.263 k allocs: 26.8 kB 2.01 k allocs: 0.186 MB 0.141
BigFloat interval/basics/+ 0.203 k allocs: 21.2 kB 1.1 k allocs: 0.103 MB 0.201
BigFloat interval/basics/- 0.203 k allocs: 21.2 kB 1.1 k allocs: 0.103 MB 0.201
BigFloat interval/basics// 0.101 k allocs: 11.6 kB 1.35 k allocs: 0.126 MB 0.09
BigFloat interval/basics/abs 0.2 k allocs: 20.9 kB 1.1 k allocs: 0.103 MB 0.198
BigFloat interval/basics/acos 1.77 k allocs: 0.115 MB 3.15 k allocs: 0.241 MB 0.477
BigFloat interval/basics/asin 1.53 k allocs: 0.0933 MB 3.09 k allocs: 0.236 MB 0.395
BigFloat interval/basics/atan 2.04 k allocs: 0.0811 MB 2.74 k allocs: 0.145 MB 0.558
BigFloat interval/basics/cos 2.45 k allocs: 0.186 MB 4.41 k allocs: 0.365 MB 0.51
BigFloat interval/basics/cosh 1.01 k allocs: 0.0683 MB 2.06 k allocs: 0.164 MB 0.416
BigFloat interval/basics/exp 0.803 k allocs: 0.041 MB 1.5 k allocs: 0.105 MB 0.391
BigFloat interval/basics/inv 0.199 k allocs: 20.8 kB 1.2 k allocs: 0.112 MB 0.181
BigFloat interval/basics/log 1.1 k allocs: 0.0977 MB 2.19 k allocs: 0.197 MB 0.497
BigFloat interval/basics/sin 2.9 k allocs: 0.198 MB 4.85 k allocs: 0.377 MB 0.526
BigFloat interval/basics/sinh 0.816 k allocs: 0.0419 MB 1.52 k allocs: 0.106 MB 0.397
BigFloat interval/basics/sqrt 0.758 k allocs: 0.0715 MB 1.99 k allocs: 0.185 MB 0.387
BigFloat interval/basics/tan 1.67 k allocs: 0.125 MB 3.42 k allocs: 0.285 MB 0.437
BigFloat interval/basics/tanh 0.809 k allocs: 0.0413 MB 1.51 k allocs: 0.105 MB 0.392
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 1.22 k allocs: 0.102 MB 0.413
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 1.22 k allocs: 0.102 MB 0.413
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.626 k allocs: 0.0532 MB 0.422
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 1.22 k allocs: 0.103 MB 0.418
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 1.22 k allocs: 0.103 MB 0.418
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.627 k allocs: 0.0546 MB 0.437
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

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