Code archives/Miscellaneous/Floating point trap

This code has been declared by its author to be Public Domain code.

Download source code

Floating point trap by Entity2001
Floats only have 7 significant digits, so the bigger your number, the more inaccurate it becomes. In normal use this won't show (because the effect is not noticable), but for large scale simulations it will.

Good to know this before you start writing Frontier Elite 3 ;)
; Identical planetary systems at different 3d world coordinates
; by Jamie "Entity" van den Berge
;
; Demonstrates that single precision float variables are not that great :)
;
Graphics3D 800,600,16,2
Global w = GraphicsWidth(), h = GraphicsHeight(), f = FontHeight()
sun = CreateLight(): RotateEntity sun, 30, -45, 0

near# = 0 : far# = 600000: vfar# = 3000000: wow# = 10000000

Type System Field moon Field distance#,r#,lx# Field l,t End Type

Function CreateSystemView.System( distance#, l, t )
	Local s.System = New System: s\distance = distance: s\l = l: s\t = t
	planet = CreateSphere(    20) : PositionEntity planet, distance, distance, distance
	camera = CreateCamera(planet) : PositionEntity camera, 0, 0, -3
	s\moon = CreateSphere( 20, planet ): ScaleEntity s\moon, 0.2, 0.2, 0.2
	CameraViewport camera, l*w/2, t*h/2, w/2, h/2: s\distance = distance
	Return s
End Function

Function UpdateSystem( s.System, orbit )
	Origin s\l*w/2, s\t*h/2: Rect 0,0,w,h,0
	Text 0,0,"Planetary system": x# = s\distance+EntityX(s\moon)
	Text 0,20,"PlanetX: "+Int(s\distance)+", MoonX: "+(x)
	Text 0,20+f,"PlanetY: "+Int(s\distance)+", MoonY: "+(s\distance+EntityY(s\moon))
	Text 0,20+f*2,"PlanetZ: "+Int(s\distance)+", MoonZ: "+(s\distance+EntityZ(s\moon))
	Text 0,h/2-f*2,"Calculated movement accuracy: "+s\r
	If x<>s\lx Then s\r = Abs(x-s\lx): s\lx = x
	PositionEntity s\moon, 2*Sin(orbit), 2*Cos(orbit), 0
End Function

Dim s.System(4)
s(0) = CreateSystemView( near, 0, 0 )
s(1) = CreateSystemView( far , 1, 0 )
s(2) = CreateSystemView( vfar, 0, 1 )
s(3) = CreateSystemView( wow , 1, 1 )

While Not KeyHit(1)
	Flip: UpdateWorld:RenderWorld: orbit = orbit + 1
	For x = 0 To 3: UpdateSystem( s(x), orbit ): Next
Wend
End


Comments

None.

Code Archives Forum