Random number precision


#1

I’m trying to generate random GPS locations withing a certain range; a square area defined using min and max positions.

For example:

float lat = ofRandom(51.954587, 51.992465);
float lon = ofRandom(5.891907, 5.964681);
ofLog() << lat << ", " << lon;

This results in a position like:

51.9607, 5.89286
51.966, 5.91742
51.9899, 5.91362
51.9913, 5.93712

As you can see the precision of the results is lower (maximum of 5 decimals) than the numbers entered into ofRandom() (6 decimals), meaning there is a larger chance of getting ending up with the same location, plus the resulting list of points is not as dense as I’d like it to be.

Does anyone know a way to generate numbers with a higher precision?


#2

I just did a quick test and my impression is that it is actually the cout who is cropping the value contained in that float to a maximum of 5 decimals.

you can try:

ofLog() << ofToString(lat, 10) << ", " << ofToString(lon, 10);

or:

std::cout.precision(20);
std::cout << lat << ", " << lon << std::endl;

My float precision issues in c++ are a bit rusty, so I could be missing something. I would suggest looking at c++ forums if precision is really important to you.


#3

It seems you’re right and ofLog() is indeed rounding the numbers while the actual floats contain numbers with more precision. I’m not quite sure how it decides to use 3/4/5/6 digits, but it doesn’t really matter.
Thanks for the feedback.