Skip to content

Numeric Boundary: Trailing Zeros

vectorGeoJSONPointEPSG:4326tinybundled

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.

Point geometry of numeric_boundary_trailing_zeros, rendered from the case's data
Point geometry, rendered from the case's actual geometry. Scale is normalized to the viewport and is not comparable between cases.
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:

pip install "geocase[all]"

View GeoCase on PyPI.

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

  • load
  • geometry-validation
  • coordinate-precision-check

Files

Browse this case on GitHub

Source and license

  • Source: geocase-synthetic
  • License: MIT

Tags

geojson numeric_boundary precision single_variable vector