Skip to content

Support type generic precision#94

Open
langestefan wants to merge 6 commits into
mainfrom
feature/type-generic-precision
Open

Support type generic precision#94
langestefan wants to merge 6 commits into
mainfrom
feature/type-generic-precision

Conversation

@langestefan
Copy link
Copy Markdown
Member

No description provided.

langestefan and others added 3 commits June 2, 2026 15:46
Make solar_position compute at the precision of the input Observer{T}, for all
five algorithms (PSA, NOAA, Walraven, USNO, SPA), from Float16 up to BigFloat.

Keystone is a type-generic time base (src/Positioning/timebase.jl): instead of
the always-Float64 datetime2julian, derive the small Julian-century / day-count
quantities at precision T. PSA/NOAA/Walraven use an integer-split form that is
both Float64-exact and magnitude-safe for low precision; USNO/SPA use a T-typed
julian_date that reproduces the original Float64 arithmetic bit-for-bit (so the
existing 1e-8 reference pins are preserved unchanged).

Also: generic calculate_deltat(::Type{T}, ...), generic default refraction
constructors (HUGHES{T}/BENNETT{T}/SG2{T}) fixing NOAA default refraction for
non-Float64, and per-element T() accumulation in the SPA periodic sums so the
Float64 coefficient tables no longer pin the result to Float64.

Adds test-typestability.jl (@inferred across types x algorithms) and
test-precision.jl (BigFloat convergence, Float64 vs BigFloat, Float32 usable).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Switch SPA (_compute_spa_srt_parameters) and USNO from the T-typed full Julian
date to the integer-split julian_day_j2000 / fractional_hour time base, so they
keep full intra-day resolution at low precision. Float32 SPA goes from ~10 deg
error (Julian-date magnitude under-resolved) to ~0.2 deg; USNO and the other
algorithms reach ~1e-2 deg. Remove the now-unused julian_date helper.

This makes our Float64 output more accurate than the external solposx Float64
references for USNO/SPA (which carry a ~1e-7 Julian-date intra-day artifact in
the sidereal terms), so relax those two reference comparisons to atol 1e-6 in
test-usno.jl, test-spa.jl and test-mtk.jl (PSA/NOAA/Walraven stay at 1e-8). The
solposx reference values themselves are unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mean_sidereal_time multiplied the day-count by 360.98564736629, reaching ~3.5e6
and costing Float32 ~0.2 deg. Pass the day-count split into exact integer days
and a full-precision [0,1) fraction (julian_day_j2000_split): the 360*n_int
whole rotations vanish mod 360, so only the 0.98564736629 deg/day drift is kept
at magnitude. Float32 SPA improves from ~0.2 deg to ~0.01 deg (worst case over
174 yr); Float64 is unchanged within the solposx 1e-6 tolerance, BigFloat still
converges, and throughput is unaffected (~1.45x faster than Float64, 2x less
memory).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 3, 2026

Benchmark Results (Julia v1)

Time benchmarks
main 656f8e4... main / 656f8e4...
ours/n=100/NOAA 0.0405 ± 0.00028 ms 0.0411 ± 0.00024 ms 0.985 ± 0.0089
ours/n=100/PSA 0.0173 ± 0.00014 ms 0.0178 ± 0.00014 ms 0.971 ± 0.011
ours/n=100/SPA 0.307 ± 0.0083 ms 0.309 ± 0.0083 ms 0.994 ± 0.038
ours/n=100/USNO 0.0391 ± 0.00013 ms 0.0386 ± 0.00034 ms 1.01 ± 0.0095
ours/n=100/Walraven 0.0208 ± 0.00033 ms 0.0208 ± 0.00036 ms 1 ± 0.024
ours/n=1000/NOAA 0.398 ± 0.0086 ms 0.403 ± 0.0087 ms 0.987 ± 0.03
ours/n=1000/PSA 0.173 ± 0.0087 ms 0.178 ± 0.0086 ms 0.973 ± 0.068
ours/n=1000/SPA 3.17 ± 0.021 ms 3.18 ± 0.023 ms 0.996 ± 0.0097
ours/n=1000/USNO 0.383 ± 0.0087 ms 0.38 ± 0.0091 ms 1.01 ± 0.033
ours/n=1000/Walraven 0.207 ± 0.01 ms 0.209 ± 0.011 ms 0.991 ± 0.07
ours/n=10000/NOAA 4.03 ± 0.022 ms 4.08 ± 0.017 ms 0.988 ± 0.0067
ours/n=10000/PSA 1.7 ± 0.0094 ms 1.75 ± 0.01 ms 0.972 ± 0.0078
ours/n=10000/SPA 32.3 ± 0.083 ms 32.4 ± 0.064 ms 0.996 ± 0.0032
ours/n=10000/USNO 3.86 ± 0.019 ms 3.84 ± 0.021 ms 1 ± 0.0074
ours/n=10000/Walraven 2.08 ± 0.01 ms 2.1 ± 0.012 ms 0.987 ± 0.0075
ours/n=100000/NOAA 41.4 ± 0.66 ms 41.9 ± 0.64 ms 0.987 ± 0.022
ours/n=100000/PSA 17.2 ± 0.2 ms 17.7 ± 0.14 ms 0.97 ± 0.014
ours/n=100000/SPA 324 ± 0.61 ms 326 ± 2.3 ms 0.996 ± 0.0074
ours/n=100000/USNO 39.3 ± 0.098 ms 39.1 ± 0.14 ms 1 ± 0.0044
ours/n=100000/Walraven 20.8 ± 0.44 ms 21.1 ± 0.51 ms 0.985 ± 0.032
refraction/ARCHER 0.000251 ± 1e-05 ms 0.00026 ± 1e-06 ms 0.965 ± 0.039
refraction/BENNETT 0.000251 ± 1e-05 ms 0.00026 ± 1e-06 ms 0.965 ± 0.039
refraction/MICHALSKY 0.000211 ± 1e-05 ms 0.00022 ± 1e-06 ms 0.959 ± 0.046
refraction/NoRefraction 0.00021 ± 1e-06 ms 0.00022 ± 9e-06 ms 0.955 ± 0.039
refraction/SG2 0.00027 ± 1e-06 ms 0.00028 ± 1e-05 ms 0.964 ± 0.035
single/NOAA 0.00045 ± 1e-05 ms 0.000461 ± 1e-06 ms 0.976 ± 0.022
single/PSA 0.00021 ± 1e-06 ms 0.000211 ± 1e-05 ms 0.995 ± 0.047
single/SPA 0.0032 ± 1.1e-05 ms 0.0032 ± 1e-05 ms 1 ± 0.0046
single/USNO 0.000411 ± 1e-05 ms 0.000421 ± 1e-05 ms 0.976 ± 0.033
single/Walraven 0.00026 ± 1e-06 ms 0.00026 ± 1e-06 ms 1 ± 0.0054
solposx/n=100/NOAA 2.94 ± 0.034 ms 2.9 ± 0.029 ms 1.01 ± 0.016
solposx/n=100/PSA 2.03 ± 0.025 ms 2.01 ± 0.022 ms 1.01 ± 0.017
solposx/n=100/SPA 2.96 ± 0.029 ms 2.9 ± 0.03 ms 1.02 ± 0.014
solposx/n=100/USNO 2.45 ± 0.031 ms 2.45 ± 0.03 ms 1 ± 0.018
solposx/n=100/Walraven 0.853 ± 0.017 ms 0.853 ± 0.015 ms 1 ± 0.027
solposx/n=1000/NOAA 3.55 ± 0.042 ms 3.51 ± 0.035 ms 1.01 ± 0.016
solposx/n=1000/PSA 2.37 ± 0.035 ms 2.34 ± 0.03 ms 1.01 ± 0.02
solposx/n=1000/SPA 7.38 ± 0.12 ms 7.29 ± 0.089 ms 1.01 ± 0.02
solposx/n=1000/USNO 6.54 ± 0.09 ms 6.6 ± 0.061 ms 0.992 ± 0.016
solposx/n=1000/Walraven 1.14 ± 0.027 ms 1.13 ± 0.027 ms 1.01 ± 0.034
solposx/n=10000/NOAA 9.54 ± 0.22 ms 9.57 ± 0.24 ms 0.997 ± 0.034
solposx/n=10000/PSA 5.73 ± 0.15 ms 5.7 ± 0.13 ms 1.01 ± 0.035
solposx/n=10000/SPA 48.2 ± 0.43 ms 48.2 ± 0.4 ms 1 ± 0.012
solposx/n=10000/USNO 47.2 ± 1 ms 48.5 ± 0.79 ms 0.974 ± 0.026
solposx/n=10000/Walraven 3.76 ± 0.09 ms 3.74 ± 0.077 ms 1.01 ± 0.032
solposx/n=100000/NOAA 68.2 ± 0.56 ms 69.2 ± 0.6 ms 0.985 ± 0.012
solposx/n=100000/PSA 39.1 ± 0.91 ms 39.2 ± 1 ms 0.998 ± 0.035
solposx/n=100000/SPA 456 ± 3.1 ms 455 ± 1.4 ms 1 ± 0.0074
solposx/n=100000/USNO 459 ± 37 ms 472 ± 47 ms 0.972 ± 0.12
solposx/n=100000/Walraven 29.6 ± 0.7 ms 29.6 ± 0.74 ms 1 ± 0.034
time_to_load 0.182 ± 0.0054 s 0.182 ± 0.0073 s 1 ± 0.05
Memory benchmarks
main 656f8e4... main / 656f8e4...
ours/n=100/NOAA 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/PSA 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/SPA 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/USNO 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/Walraven 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=1000/NOAA 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/PSA 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/SPA 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/USNO 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/Walraven 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=10000/NOAA 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/PSA 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/SPA 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/USNO 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/Walraven 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=100000/NOAA 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/PSA 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/SPA 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/USNO 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/Walraven 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
refraction/ARCHER 0 allocs: 0 B 0 allocs: 0 B
refraction/BENNETT 0 allocs: 0 B 0 allocs: 0 B
refraction/MICHALSKY 0 allocs: 0 B 0 allocs: 0 B
refraction/NoRefraction 0 allocs: 0 B 0 allocs: 0 B
refraction/SG2 0 allocs: 0 B 0 allocs: 0 B
single/NOAA 0 allocs: 0 B 0 allocs: 0 B
single/PSA 0 allocs: 0 B 0 allocs: 0 B
single/SPA 0 allocs: 0 B 0 allocs: 0 B
single/USNO 0 allocs: 0 B 0 allocs: 0 B
single/Walraven 0 allocs: 0 B 0 allocs: 0 B
solposx/n=100/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=100/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=1000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=10000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=100000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
time_to_load 0.145 k allocs: 11 kB 0.145 k allocs: 11 kB 1

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 3, 2026

Benchmark Results (Julia vpre)

Time benchmarks
main 656f8e4... main / 656f8e4...
ours/n=100/NOAA 0.0397 ± 0.00029 ms 0.0405 ± 0.00033 ms 0.982 ± 0.011
ours/n=100/PSA 0.0174 ± 0.00016 ms 0.0177 ± 0.00018 ms 0.98 ± 0.013
ours/n=100/SPA 0.456 ± 0.0093 ms 0.459 ± 0.0092 ms 0.993 ± 0.028
ours/n=100/USNO 0.037 ± 0.00018 ms 0.0379 ± 0.00052 ms 0.977 ± 0.014
ours/n=100/Walraven 0.0205 ± 0.00043 ms 0.0205 ± 0.00049 ms 0.999 ± 0.032
ours/n=1000/NOAA 0.389 ± 0.009 ms 0.401 ± 0.0098 ms 0.972 ± 0.033
ours/n=1000/PSA 0.175 ± 0.008 ms 0.179 ± 0.0077 ms 0.975 ± 0.061
ours/n=1000/SPA 4.68 ± 0.033 ms 4.71 ± 0.028 ms 0.994 ± 0.0091
ours/n=1000/USNO 0.364 ± 0.0098 ms 0.374 ± 0.0097 ms 0.975 ± 0.036
ours/n=1000/Walraven 0.205 ± 0.0077 ms 0.208 ± 0.0096 ms 0.983 ± 0.059
ours/n=10000/NOAA 3.96 ± 0.025 ms 4.03 ± 0.035 ms 0.981 ± 0.01
ours/n=10000/PSA 1.73 ± 0.0082 ms 1.78 ± 0.01 ms 0.973 ± 0.0072
ours/n=10000/SPA 47.1 ± 0.54 ms 47 ± 0.42 ms 1 ± 0.015
ours/n=10000/USNO 3.69 ± 0.031 ms 3.78 ± 0.059 ms 0.977 ± 0.017
ours/n=10000/Walraven 2.06 ± 0.0097 ms 2.08 ± 0.01 ms 0.988 ± 0.0068
ours/n=100000/NOAA 40.8 ± 0.62 ms 41.6 ± 1.6 ms 0.981 ± 0.041
ours/n=100000/PSA 17.4 ± 0.15 ms 17.9 ± 1 ms 0.974 ± 0.057
ours/n=100000/SPA 474 ± 1.8 ms 478 ± 0.51 ms 0.99 ± 0.0038
ours/n=100000/USNO 37.6 ± 0.6 ms 38.5 ± 0.69 ms 0.977 ± 0.024
ours/n=100000/Walraven 20.5 ± 0.47 ms 20.7 ± 0.74 ms 0.989 ± 0.042
refraction/ARCHER 0.000251 ± 1e-05 ms 0.00026 ± 1e-06 ms 0.965 ± 0.039
refraction/BENNETT 0.00025 ± 1e-06 ms 0.00026 ± 1e-05 ms 0.962 ± 0.037
refraction/MICHALSKY 0.00021 ± 1e-06 ms 0.00022 ± 1e-06 ms 0.955 ± 0.0063
refraction/NoRefraction 0.00021 ± 9e-06 ms 0.00022 ± 1e-05 ms 0.955 ± 0.06
refraction/SG2 0.00027 ± 1e-06 ms 0.000271 ± 1e-06 ms 0.996 ± 0.0052
single/NOAA 0.00044 ± 1e-05 ms 0.00045 ± 1e-05 ms 0.978 ± 0.031
single/PSA 0.00021 ± 1e-06 ms 0.000211 ± 1e-05 ms 0.995 ± 0.047
single/SPA 0.00421 ± 5.1e-05 ms 0.00425 ± 8e-05 ms 0.99 ± 0.022
single/USNO 0.000401 ± 1e-06 ms 0.00042 ± 1e-05 ms 0.955 ± 0.023
single/Walraven 0.00026 ± 1e-06 ms 0.00026 ± 1e-05 ms 1 ± 0.039
solposx/n=100/NOAA 2.9 ± 0.036 ms 2.9 ± 0.037 ms 0.999 ± 0.018
solposx/n=100/PSA 2.02 ± 0.027 ms 2.01 ± 0.025 ms 1 ± 0.019
solposx/n=100/SPA 2.98 ± 0.035 ms 2.92 ± 0.034 ms 1.02 ± 0.017
solposx/n=100/USNO 2.44 ± 0.034 ms 2.43 ± 0.032 ms 1 ± 0.019
solposx/n=100/Walraven 0.856 ± 0.017 ms 0.848 ± 0.015 ms 1.01 ± 0.027
solposx/n=1000/NOAA 3.53 ± 0.047 ms 3.54 ± 0.038 ms 0.998 ± 0.017
solposx/n=1000/PSA 2.35 ± 0.033 ms 2.35 ± 0.029 ms 1 ± 0.019
solposx/n=1000/SPA 7.53 ± 0.17 ms 7.44 ± 0.12 ms 1.01 ± 0.028
solposx/n=1000/USNO 6.61 ± 0.074 ms 6.53 ± 0.07 ms 1.01 ± 0.016
solposx/n=1000/Walraven 1.14 ± 0.03 ms 1.13 ± 0.026 ms 1.01 ± 0.035
solposx/n=10000/NOAA 9.53 ± 0.12 ms 9.56 ± 0.1 ms 0.998 ± 0.017
solposx/n=10000/PSA 5.73 ± 0.079 ms 5.8 ± 0.074 ms 0.989 ± 0.019
solposx/n=10000/SPA 48.3 ± 0.32 ms 48 ± 0.3 ms 1.01 ± 0.0093
solposx/n=10000/USNO 49.3 ± 0.61 ms 48.5 ± 0.68 ms 1.02 ± 0.019
solposx/n=10000/Walraven 3.77 ± 0.052 ms 3.76 ± 0.046 ms 1 ± 0.018
solposx/n=100000/NOAA 68.7 ± 0.46 ms 68.3 ± 0.23 ms 1.01 ± 0.0076
solposx/n=100000/PSA 39.4 ± 0.6 ms 39.3 ± 0.46 ms 1 ± 0.019
solposx/n=100000/SPA 467 ± 9.2 ms 466 ± 8.4 ms 1 ± 0.027
solposx/n=100000/USNO 470 ± 40 ms 463 ± 37 ms 1.01 ± 0.12
solposx/n=100000/Walraven 29.7 ± 0.62 ms 29.6 ± 0.57 ms 1 ± 0.029
time_to_load 0.133 ± 0.0014 s 0.13 ± 0.0011 s 1.02 ± 0.014
Memory benchmarks
main 656f8e4... main / 656f8e4...
ours/n=100/NOAA 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/PSA 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/SPA 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/USNO 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/Walraven 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=1000/NOAA 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/PSA 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/SPA 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/USNO 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/Walraven 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=10000/NOAA 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/PSA 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/SPA 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/USNO 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/Walraven 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=100000/NOAA 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/PSA 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/SPA 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/USNO 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/Walraven 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
refraction/ARCHER 0 allocs: 0 B 0 allocs: 0 B
refraction/BENNETT 0 allocs: 0 B 0 allocs: 0 B
refraction/MICHALSKY 0 allocs: 0 B 0 allocs: 0 B
refraction/NoRefraction 0 allocs: 0 B 0 allocs: 0 B
refraction/SG2 0 allocs: 0 B 0 allocs: 0 B
single/NOAA 0 allocs: 0 B 0 allocs: 0 B
single/PSA 0 allocs: 0 B 0 allocs: 0 B
single/SPA 0 allocs: 0 B 0 allocs: 0 B
single/USNO 0 allocs: 0 B 0 allocs: 0 B
single/Walraven 0 allocs: 0 B 0 allocs: 0 B
solposx/n=100/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=100/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=1000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=10000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=100000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
time_to_load 0.205 k allocs: 11.9 kB 0.205 k allocs: 11.9 kB 1

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 3, 2026

Benchmark Results (Julia vlts)

Time benchmarks
main 656f8e4... main / 656f8e4...
ours/n=100/NOAA 0.0415 ± 0.00082 ms 0.0426 ± 0.00084 ms 0.973 ± 0.027
ours/n=100/PSA 0.0188 ± 0.0013 ms 0.0192 ± 0.0012 ms 0.975 ± 0.093
ours/n=100/SPA 0.336 ± 0.0048 ms 0.337 ± 0.0047 ms 0.997 ± 0.02
ours/n=100/USNO 0.0387 ± 0.0006 ms 0.0396 ± 0.00045 ms 0.976 ± 0.019
ours/n=100/Walraven 0.0193 ± 0.00025 ms 0.0196 ± 0.00022 ms 0.985 ± 0.017
ours/n=1000/NOAA 0.405 ± 0.0053 ms 0.414 ± 0.0052 ms 0.979 ± 0.018
ours/n=1000/PSA 0.18 ± 0.0069 ms 0.183 ± 0.0064 ms 0.984 ± 0.051
ours/n=1000/SPA 3.42 ± 0.016 ms 3.44 ± 0.016 ms 0.995 ± 0.0066
ours/n=1000/USNO 0.381 ± 0.0052 ms 0.39 ± 0.005 ms 0.976 ± 0.018
ours/n=1000/Walraven 0.197 ± 0.0071 ms 0.199 ± 0.0069 ms 0.986 ± 0.049
ours/n=10000/NOAA 4.07 ± 0.027 ms 4.16 ± 0.025 ms 0.978 ± 0.0088
ours/n=10000/PSA 1.79 ± 0.0081 ms 1.83 ± 0.011 ms 0.979 ± 0.0075
ours/n=10000/SPA 34.2 ± 0.073 ms 34.3 ± 0.084 ms 0.996 ± 0.0032
ours/n=10000/USNO 3.84 ± 0.025 ms 3.95 ± 0.024 ms 0.973 ± 0.0086
ours/n=10000/Walraven 1.97 ± 0.0083 ms 1.99 ± 0.0078 ms 0.988 ± 0.0057
ours/n=100000/NOAA 41.8 ± 0.52 ms 42.8 ± 0.48 ms 0.977 ± 0.016
ours/n=100000/PSA 17.9 ± 0.1 ms 18.4 ± 0.096 ms 0.973 ± 0.0074
ours/n=100000/SPA 344 ± 1.3 ms 344 ± 0.79 ms 0.999 ± 0.0045
ours/n=100000/USNO 39 ± 0.2 ms 40.1 ± 0.22 ms 0.973 ± 0.0074
ours/n=100000/Walraven 19.8 ± 0.065 ms 20 ± 0.081 ms 0.987 ± 0.0052
refraction/ARCHER 0.00024 ± 2e-06 ms 0.000247 ± 3e-06 ms 0.972 ± 0.014
refraction/BENNETT 0.000233 ± 2e-06 ms 0.000239 ± 3e-06 ms 0.975 ± 0.015
refraction/MICHALSKY 0.000199 ± 3e-06 ms 0.000206 ± 2e-06 ms 0.966 ± 0.017
refraction/NoRefraction 0.000197 ± 3e-06 ms 0.000206 ± 3e-06 ms 0.956 ± 0.02
refraction/SG2 0.000247 ± 3e-06 ms 0.000253 ± 2e-06 ms 0.976 ± 0.014
single/NOAA 0.00044 ± 5e-06 ms 0.000447 ± 4e-06 ms 0.984 ± 0.014
single/PSA 0.000198 ± 2e-06 ms 0.000207 ± 3e-06 ms 0.957 ± 0.017
single/SPA 0.00348 ± 1.9e-05 ms 0.00348 ± 2e-05 ms 0.998 ± 0.0079
single/USNO 0.000393 ± 4e-06 ms 0.000404 ± 4e-06 ms 0.973 ± 0.014
single/Walraven 0.00023 ± 2e-06 ms 0.000232 ± 3e-06 ms 0.991 ± 0.015
solposx/n=100/NOAA 3.6 ± 0.16 ms 3.53 ± 0.11 ms 1.02 ± 0.054
solposx/n=100/PSA 2.58 ± 0.11 ms 2.54 ± 0.097 ms 1.01 ± 0.059
solposx/n=100/SPA 3.1 ± 0.13 ms 3.12 ± 0.13 ms 0.991 ± 0.057
solposx/n=100/USNO 2.81 ± 0.1 ms 2.77 ± 0.095 ms 1.01 ± 0.051
solposx/n=100/Walraven 1.1 ± 0.14 ms 1.08 ± 0.12 ms 1.01 ± 0.17
solposx/n=1000/NOAA 4.26 ± 0.13 ms 4.29 ± 0.18 ms 0.994 ± 0.053
solposx/n=1000/PSA 2.74 ± 0.073 ms 2.75 ± 0.081 ms 0.994 ± 0.039
solposx/n=1000/SPA 7.05 ± 0.24 ms 7.25 ± 0.24 ms 0.972 ± 0.046
solposx/n=1000/USNO 6.81 ± 0.17 ms 7.01 ± 0.37 ms 0.971 ± 0.057
solposx/n=1000/Walraven 1.38 ± 0.1 ms 1.39 ± 0.13 ms 0.996 ± 0.12
solposx/n=10000/NOAA 10.3 ± 0.31 ms 10.5 ± 0.24 ms 0.984 ± 0.037
solposx/n=10000/PSA 5.81 ± 0.17 ms 5.99 ± 0.17 ms 0.971 ± 0.039
solposx/n=10000/SPA 40.9 ± 0.41 ms 42 ± 0.31 ms 0.974 ± 0.012
solposx/n=10000/USNO 45.7 ± 0.86 ms 45.8 ± 0.83 ms 0.996 ± 0.026
solposx/n=10000/Walraven 3.64 ± 0.097 ms 3.77 ± 0.12 ms 0.967 ± 0.039
solposx/n=100000/NOAA 75.2 ± 0.71 ms 77.4 ± 0.95 ms 0.971 ± 0.015
solposx/n=100000/PSA 39.5 ± 0.71 ms 39.8 ± 0.54 ms 0.992 ± 0.022
solposx/n=100000/SPA 439 ± 3.9 ms 449 ± 3.9 ms 0.978 ± 0.012
solposx/n=100000/USNO 446 ± 38 ms 449 ± 42 ms 0.993 ± 0.12
solposx/n=100000/Walraven 28.9 ± 0.56 ms 29.4 ± 0.47 ms 0.984 ± 0.025
time_to_load 0.163 ± 0.0022 s 0.163 ± 0.00088 s 0.999 ± 0.014
Memory benchmarks
main 656f8e4... main / 656f8e4...
ours/n=100/NOAA 5 allocs: 4.38 kB 5 allocs: 4.38 kB 1
ours/n=100/PSA 3 allocs: 2.62 kB 3 allocs: 2.62 kB 1
ours/n=100/SPA 5 allocs: 4.38 kB 5 allocs: 4.38 kB 1
ours/n=100/USNO 3 allocs: 2.62 kB 3 allocs: 2.62 kB 1
ours/n=100/Walraven 3 allocs: 2.62 kB 3 allocs: 2.62 kB 1
ours/n=1000/NOAA 5 allocs: 0.0388 MB 5 allocs: 0.0388 MB 1
ours/n=1000/PSA 3 allocs: 23.8 kB 3 allocs: 23.8 kB 1
ours/n=1000/SPA 5 allocs: 0.0388 MB 5 allocs: 0.0388 MB 1
ours/n=1000/USNO 3 allocs: 23.8 kB 3 allocs: 23.8 kB 1
ours/n=1000/Walraven 3 allocs: 23.8 kB 3 allocs: 23.8 kB 1
ours/n=10000/NOAA 10 allocs: 0.382 MB 10 allocs: 0.382 MB 1
ours/n=10000/PSA 6 allocs: 0.229 MB 6 allocs: 0.229 MB 1
ours/n=10000/SPA 10 allocs: 0.382 MB 10 allocs: 0.382 MB 1
ours/n=10000/USNO 6 allocs: 0.229 MB 6 allocs: 0.229 MB 1
ours/n=10000/Walraven 6 allocs: 0.229 MB 6 allocs: 0.229 MB 1
ours/n=100000/NOAA 10 allocs: 3.81 MB 10 allocs: 3.81 MB 1
ours/n=100000/PSA 6 allocs: 2.29 MB 6 allocs: 2.29 MB 1
ours/n=100000/SPA 10 allocs: 3.81 MB 10 allocs: 3.81 MB 1
ours/n=100000/USNO 6 allocs: 2.29 MB 6 allocs: 2.29 MB 1
ours/n=100000/Walraven 6 allocs: 2.29 MB 6 allocs: 2.29 MB 1
refraction/ARCHER 0 allocs: 0 B 0 allocs: 0 B
refraction/BENNETT 0 allocs: 0 B 0 allocs: 0 B
refraction/MICHALSKY 0 allocs: 0 B 0 allocs: 0 B
refraction/NoRefraction 0 allocs: 0 B 0 allocs: 0 B
refraction/SG2 0 allocs: 0 B 0 allocs: 0 B
single/NOAA 0 allocs: 0 B 0 allocs: 0 B
single/PSA 0 allocs: 0 B 0 allocs: 0 B
single/SPA 0 allocs: 0 B 0 allocs: 0 B
single/USNO 0 allocs: 0 B 0 allocs: 0 B
single/Walraven 0 allocs: 0 B 0 allocs: 0 B
solposx/n=100/NOAA 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=100/PSA 0.06 k allocs: 1.66 kB 0.06 k allocs: 1.66 kB 1
solposx/n=100/SPA 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=100/USNO 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=100/Walraven 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=1000/NOAA 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=1000/PSA 0.06 k allocs: 1.66 kB 0.06 k allocs: 1.66 kB 1
solposx/n=1000/SPA 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=1000/USNO 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=1000/Walraven 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=10000/NOAA 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=10000/PSA 0.06 k allocs: 1.66 kB 0.06 k allocs: 1.66 kB 1
solposx/n=10000/SPA 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=10000/USNO 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=10000/Walraven 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=100000/NOAA 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=100000/PSA 0.06 k allocs: 1.66 kB 0.06 k allocs: 1.66 kB 1
solposx/n=100000/SPA 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=100000/USNO 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
solposx/n=100000/Walraven 22 allocs: 0.781 kB 22 allocs: 0.781 kB 1
time_to_load 0.153 k allocs: 14.5 kB 0.153 k allocs: 14.5 kB 1

langestefan and others added 2 commits June 3, 2026 09:59
Direction cosines fed to asin/acos can round just past ±1 in Float16/Float32,
throwing a DomainError (e.g. NOAA and Walraven threw on a full-year Float32
sweep). Clamp those arguments to [-1, 1] via a small unit_clamp helper at the 13
asin/acos sites across the five algorithms. The clamp only activates outside the
valid range, which Float64 never reaches for the reference conditions, so Float64
output (and the solposx references) are unchanged. All algorithms now run
crash-free at Float32.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The time-base helpers are internal (not exported), but their docstrings tripped
Documenter's strict missing_docs check (they are not in the manual). Convert them
to plain `#` comments, matching the convention for other internal helpers
(sum_periodic_terms, mean_sidereal_time, ...). Fixes the docs CI build.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Jun 3, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.85%. Comparing base (701f158) to head (656f8e4).

Additional details and impacted files
@@             Coverage Diff             @@
##              main      #94      +/-   ##
===========================================
- Coverage   100.00%   99.85%   -0.15%     
===========================================
  Files           17       18       +1     
  Lines          666      683      +17     
===========================================
+ Hits           666      682      +16     
- Misses           0        1       +1     

☔ 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.

Cover the new public-API surface that algorithms don't exercise internally: the
calculate_deltat(::Type{T}, …) methods for the (year, month) and ZonedDateTime
signatures, and the HUGHES{T}()/BENNETT{T}()/SG2{T}() parametric default
constructors. Restores patch coverage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

1 participant