Numeric Boundary: Trailing Zeros¶
A single-point GeoJSON whose coordinate decimal expansion at 15 places ends in zeros. One of the two patterns intelliround (ogr/ogrutils.cpp:161-169) special-cases: it tests s[len-3] through s[len-9] for zeros and then drops the last 8 characters, including the untested s[len-2]. 0.000000010000001 loses its trailing 1 through exactly this path, which is the same mechanism as the 1e-14 finding at a magnitude nobody would call small.
| Property | Value |
|---|---|
| Case ID | numeric_boundary_trailing_zeros |
| Category | vector |
| Format | GeoJSON |
| Geometry type | Point |
| CRS | EPSG:4326 |
| Location | 0.00°E, 50.00°N → 0.00°E, 50.00°N |
| Test tier | unit |
| Size class | tiny |
| Storage class | bundled |
| Redistributable | yes |
| Loader | geopandas |
| Status | validated |
Use this case¶
import pytest
@pytest.mark.geocase_case("numeric_boundary_trailing_zeros")
def test_numeric_boundary_trailing_zeros(geocase_case) -> None:
data = geocase_case.load()
assert data is not None
Use GeoCase in your tests¶
Install the complete set of vector, raster, and NetCDF dependencies:
What this case checks¶
Establish whether a text write/read cycle returns this coordinate unchanged. The expected answer ships with the case, so a consumer is graded rather than left to re-derive what "survived" means.
Risk types covered¶
Expected behavior¶
| Assertion | Expected |
|---|---|
expect_loadable |
yes |
expect_valid_geometry |
yes |
expect_crs |
yes |
expected_epsg |
4326 |
expected_geometry_types |
Point |
expected_roundtrip_coordinates |
[1.0000001e-08, 50.00000001] |
Notes¶
The property¶
The single point in this file decimal expansion at 15 places ends in zeros:
| value | shortest round-trip repr | |
|---|---|---|
| x | 1.0000001e-08 |
1.0000001e-08 |
| y | 50.00000001 |
50.00000001 |
One feature, one property. Plan 40's control principle: if a consumer fails this case and passes its siblings, the failure names the property.
Why this value¶
One of the two patterns intelliround (ogr/ogrutils.cpp:161-169) special-cases: it tests s[len-3] through s[len-9] for zeros and then drops the last 8 characters, including the untested s[len-2]. 0.000000010000001 loses its trailing 1 through exactly this path, which is the same mechanism as the 1e-14 finding at a magnitude nobody would call small.
What to assert¶
assertions.expected_roundtrip_coordinates carries the pair the file holds.
Write the case out in your own format, read it back, and compare against that
field rather than against a tolerance you chose:
import geocase
meta = geocase.get_case("numeric_boundary_trailing_zeros")
expected = meta.assertions.expected_roundtrip_coordinates
A tolerance hides the failure this family exists to find -- GDAL
d6fd56f52d writes 1e-14 as 0, and every tolerance loose enough to be
"reasonable" for a coordinate near zero passes that silently.
Provenance¶
Plan 44 phase 2, from the 2026-09-06 run against GDAL d6fd56f52d. See
docs/plans/44-gdal-as-target-and-the-numeric-axis.md.
Required capabilities¶
loadgeometry-validationcoordinate-precision-check
Files¶
- Primary:
numeric_boundary_trailing_zeros.geojson - Notes:
notes.md
Source and license¶
- Source: geocase-synthetic
- License: MIT
Tags¶
geojson numeric_boundary precision single_variable vector
Related cases¶
- Numeric Boundary: 1e-14 --
numeric_boundary_1e14 - Numeric Boundary: Trailing Nines --
numeric_boundary_trailing_nines - Numeric Boundary: 15 Significant Digits --
numeric_boundary_15_significant_digits - Numeric Boundary: 17 Significant Digits --
numeric_boundary_17_significant_digits - Numeric Boundary: 1e-13 --
numeric_boundary_1e13