Floating point values lose precision when they get larger. Keep your values as close to zero as you can. For large worlds, split them into chunks (addressed by integer chunk coordinates) and then make world coordinates relative to the "current" chunk (where the player or camera is), shifting objects whenever you move to another chunk. With this approach your world coordinates will snap back closer to zero when you move far enough, avoiding precision problems.
For instance, if you're in chunk 3,2
and your chunks are 64 units wide then the world coordinate used for the center of chunk 4,7
would be (64,320)
. If the camera moved to chunk 4,5
then chunk 4,7
would be centered at world coordinate (0,192)
instead, being shifted along with all of its children.
You can either update all chunk/object world positions as you move between chunks or you can store everything in a tree and recalculate hierarchical model-world matrices using the delta of integer coordinates for each chunk from the cameras chunk.
For large distances, scale down the objects being rendered. You don't need centimeter precision for a view where each pixel is roughly a meter of terrain. Use scaled coordinates for rendering if you can.
You could also switch to using doubles but then you'd need recent hardware and things will be slower; better to spend effort on fixing your world basis.