# Measured accuracy
Measured on Darwin arm64 (CPython 3.14.7), NumPy 2.4.2, SciPy 1.17.0.
The values describe this deterministic corpus, not universal error bounds or independent scientific validation.
No algorithm, physical-range validation, or calendar preparation changes in this contract.
## Workflow measurements
Each row compares a complete workflow against the Python/SciPy reference with native dispatch disabled.
The harness verifies that the listed Rust kernels actually ran.
A workflow error is not an isolated error bound for each kernel it uses.
The numerical contracts on each function identify the applicable rows.
The corpus comes from `tests/parity_registry.py::SAMPLES`, with fixed seeds 20261009, 20261010, and 20261011.
It contains 35 monthly years, five 365-day daily years, and a 35-year monthly Spatial Block with three cells.
The samples include zeros, NaNs, and extreme precipitation; entry-specific derivations prepare each kernel's inputs.
Palmer replaces gaps and clips precipitation to [5, 300] in the inch-based water-balance inputs.
The monthly record starts in 1981; its Calibration Period includes 1983 through the final record year, 2015.
Only `flood_edi` and `flood_flood_index` prepare an all-leap calendar; `flood_pe` and `flood_api` retain the 365-day inputs.
The registry records the exact derivations and parameters.
| `eddi` | `hastings_inverse_normal`, `tukey_probabilities` | 0.000000e+00 | 0.000000e+00 |
| `eddi_spatial_block` | `hastings_inverse_normal`, `tukey_probabilities` | 0.000000e+00 | 0.000000e+00 |
| `fire_drought_code` | `drought_code` | 0.000000e+00 | 0.000000e+00 |
| `fire_duff_moisture_code` | `duff_moisture_code` | 0.000000e+00 | 0.000000e+00 |
| `fire_ffmc` | `ffmc` | 0.000000e+00 | 0.000000e+00 |
| `fire_kbdi` | `kbdi` | 0.000000e+00 | 0.000000e+00 |
| `fit_diagnostics` | `gamma_parameters` | 0.000000e+00 | 0.000000e+00 |
| `flood_api` | `antecedent_precipitation_index` | no finite comparison | no finite comparison |
| `flood_edi` | `edi`, `effective_precipitation` | 8.526513e-14 | 7.882583e-15 |
| `flood_flood_index` | `effective_precipitation`, `flood_index` | 2.220446e-16 | 1.096055e-15 |
| `flood_pe` | `effective_precipitation` | 4.547474e-13 | 2.780533e-16 |
| `hargreaves` | `hargreaves` | 4.440892e-16 | 1.974933e-16 |
| `palmer_pdsi` | `palmer_k_prime`, `palmer_pdi`, `palmer_raw_zindex`, `palmer_water_balance` | 0.000000e+00 | 0.000000e+00 |
| `palmer_scpdsi` | `palmer_k_prime`, `palmer_raw_zindex`, `palmer_water_balance`, `palmer_wells`, `scpdsi_duration_factors` | 0.000000e+00 | 0.000000e+00 |
| `pci` | `pci` | 0.000000e+00 | 0.000000e+00 |
| `pearson_ks_statistics` | `pearson_ks_statistics` | 3.330669e-16 | 1.829831e-15 |
| `penman_monteith` | `fao56_eto` | 8.881784e-16 | 4.336616e-16 |
| `percentage_of_normal` | `pnp_normals`, `pnp_percentages` | 0.000000e+00 | 0.000000e+00 |
| `pm_eto_intermediates` | `pm_eto` | 0.000000e+00 | 0.000000e+00 |
| `spei_gamma` | `gamma_parameters`, `gamma_probabilities`, `norm_ppf` | 2.220446e-16 | 3.456693e-16 |
| `spei_loglogistic` | `loglogistic_cdf`, `loglogistic_parameters` | 0.000000e+00 | 0.000000e+00 |
| `spi_gamma` | `gamma_parameters`, `gamma_probabilities`, `norm_ppf` | 1.998401e-15 | 4.764927e-14 |
| `spi_gamma_mean_zero` | `gamma_parameters`, `gamma_probabilities`, `norm_ppf` | 1.998401e-15 | 4.764927e-14 |
| `spi_gamma_spatial_block` | `gamma_parameters`, `gamma_probabilities`, `norm_ppf` | 7.105427e-15 | 1.867507e-13 |
| `spi_pearson` | `pearson_cdf`, `pearson_ks_statistics`, `pearson_parameters` | 8.604228e-15 | 6.821559e-14 |
| `thornthwaite` | `thornthwaite` | 2.842171e-14 | 2.207812e-16 |
These entries have no finite comparison on this corpus: `flood_api`.
Those rows record only matching NaN positions or signed infinities, not a numeric error.
## Direct special-function measurements
`crates/climate-indices/examples/special_accuracy.rs` prints scalar results for direct comparison with SciPy.
Gamma probes cross 14 shape values with 14 argument values from zero through 1e6, infinity, and NaN.
Quantile probes include 1e-300, central probabilities, both endpoints, and invalid inputs.
Normal-CDF probes include both tails through +/-40, zero, infinities, and NaN.
These rows measure the named scalar function, without an index workflow.
The corpus has 427 probes: 196 per gamma function, 12 per quantile function, and 11 normal-CDF probes.
The generator rejects missing, duplicated, or changed probe coordinates, including non-finite inputs.
| `special_igam` | 3.330669e-16 | 6.960316e-15 |
| `special_igamc` | 1.110223e-16 | 3.704547e-15 |
| `special_ndtr` | 0.000000e+00 | 0.000000e+00 |
| `special_ndtri` | 0.000000e+00 | 0.000000e+00 |
| `special_norm_ppf` | 0.000000e+00 | 0.000000e+00 |
## Interpretation and reproduction
Absolute error is `abs(rust - reference)`; relative error divides that error by `abs(reference)` for nonzero references.
Zero references contribute only to absolute error. Matching NaNs and matching signed infinities do not contribute to maxima.
The tests check NaN positions and infinity signs separately through the parity comparator.
Every comparison must satisfy `rtol = atol = 1e-10`; those tolerances are acceptance criteria, not measured errors.
A reported relative error can exceed the relative tolerance when the absolute tolerance governs a value near zero.
State-plumbing helpers copy or index values and have no independent arithmetic accuracy claim.
Rust-only verification coverage and independent reference fixtures remain separate from these workflow measurements.
From the repository root, build the extension and regenerate this page:
```bash
uv run maturin develop --release
uv run python scripts/native_parity_maxima.py --write-contract
```
The second command also runs `cargo run -p climate-indices --example special_accuracy --quiet`.
Run `uv run pytest tests/test_native_parity_registry.py` to exercise the same deterministic workflow comparisons and property draws.
Cross-platform differences can change the maxima. Regenerate the page only after reviewing those differences.