2026.08.21
Accuracy work at high latitude, the first oracle coverage fajr and isha have ever had, and a check that stops a released version number from naming two different files.
| Header | Version | Changed |
|---|---|---|
prayertimes.h |
v0.2.1 to v0.2.2 |
yes |
hijri.h |
v0.1.0 |
documentation only |
timezone.h |
v0.1.0 to v0.1.1 |
yes, Windows only |
prayertimes.h v0.2.2
refine_event now iterates to convergence instead of taking a single correction step (#80). Measured against the 2026.08.20 asset over MWL at longitude 0, latitude -70 to 70 in steps of 5, every day of 2026, all five fields: 30793 of 52925 values move, 52 change the displayed HH:MM, and the largest shift is 200 seconds at latitude -70 on 17 November. The large ones are all in the grazing band, where the Sun approaches the target depression without clearly crossing it.
No API change. struct PrayerTimes, MethodParams and every function signature are identical, so anything compiled against v0.2.1 still compiles.
timezone.h v0.1.1
The Windows lookup enumerated the timezone registry on every call. It now enumerates once behind InitOnceExecuteOnce (#76), which took 2000 lookups from 41 ms each to 0.0255 ms each. muslim_iana_to_windows_zone was removed as dead code and restored when it turned out a consumer links against it (#77).
No change on Linux or macOS.
Validation
Fajr and isha had no oracle at all before this release. They have one now, comparing against JPL DE440 in the angle domain rather than the time domain, since at grazing incidence a small angular error becomes a large time error (#73, closing #52). The polar region got the same treatment (#72). The oracle grew from 14236 checks to 39549.
hijri.h gained a measured statement of what actually bounds it, rather than a described one: validated 1900 to 2100, Umm al-Qura table 1882 to 2174, and a delta T model adequate from 1600 to 2200 (#78).
Infrastructure
The Windows branch of timezone.h is roughly 160 lines that nothing had ever compiled, on CI or on the author's machine. It is now built and tested under mingw-w64 (#74).
tools/check-header-versions.sh compares each header against every published release asset and fails when a release already carries that version string over different code (#81). Comments are stripped first, so documentation changes do not demand a bump. This exists because the same mistake happened three times: v0.2.0 shipped twice with different behaviour, then v0.2.1 did, then timezone.h v0.1.0 did.
Known issues
#79 is open. Twilight times can be up to 6 minutes out where the Sun grazes the target depression. Iterating refine_event reduces it but does not remove it, because at those latitudes the event can cease to exist between iterations. A different method is needed, solving for closest approach rather than for a root.
#51 and #56 are open design questions about polar-circle behaviour and the day offset.