I think I need to chime in in this thread, because I can claim some
minor knowledge about how GPS systems work.
The principle behind GPS is that each GPS satellite broadcasts the time and it's position (that's a slight over simplification). If you have the signal from four satellites, you can determine your position and the time based on how long it has taken a signal to travel from where the satellite is to where you are (remember your basic maths, there are four unknowns (x,y,z and time) so you need four simultaneous equations (i.e. satellites)). So then you know your position in 3d space and time.
That's the theory. Unfortunately the implementation is not quite(!) so simple. There are a couple of key issues.
Firstly, you may only be able to get a signal from three satellites. Four unknowns, three equations. That doesn't work. However, since the earth is roughly circular and the GPS receiver knows the typical radius (actually most modern receivers know a good bit more than that) if it can't get four satellites it will assume that you are on the average surface and give you your position in 2d as Lat/Lon on the basis that this is quite likely and a lot more useful than saying "sorry, no position fix available". This is where the rumours about GPS being 2d come from.
Secondly, you can't solve the simultaneous equations analytically, you have to do it arithmetically (if you don't understand what this means, just take my word for it that this degrades the accuracy because the theory says that to get a perfectly accurate fix would take an infinite amount of time).
Finally, if you've followed this far speed and heading indications from most GPS units aren't the result of the difference between two position fixes, they are calculated in yet another way -and I'm not happy trying to explain how that works!
(Also, I haven't mentioned augmentation signals or DGPS here but I think that would complicate things unnecessarily)
So in summary, GPS as a system is very accurate when working perfectly and degrades very gracefully, but many implementations don't tell you when the accuracy is degraded which can confuse.
And since I'm quite drunk whilst writing this, if anyone has managed to follow it, I'm very impressed
