Support

If you have a problem or need to report a bug please email : support@dsprobotics.com

There are 3 sections to this support area:

DOWNLOADS: access to product manuals, support files and drivers

HELP & INFORMATION: tutorials and example files for learning or finding pre-made modules for your projects

USER FORUMS: meet with other users and exchange ideas, you can also get help and assistance here

NEW REGISTRATIONS - please contact us if you wish to register on the forum

Users are reminded of the forum rules they sign up to which prohibits any activity that violates any laws including posting material covered by copyright

rounding stream and the magic NR!?

For general discussion related FlowStone

rounding stream and the magic NR!?

Postby Nubeat7 » Wed May 15, 2013 7:03 pm

hi, as already worked out with troga little bit in my ppq stepposition thread, there are some questions about rounding in stream, spezially to round down to int, here i have 3 methods of how to do it and their behaviors,

the first one in both examples always works right but is cpu intensive, the most common method to subtract 0.5 works with 0.4999995! this is the real magic number trog told me while ago that it is 0.49999997!? so can there be a difference in different cpus? or did something changed in FS and why does 0.4999996 works with the number 8 but not with 9?

the second often used method is:
rounded = rndint(x)
rounded = rounded -1(rounded > x)

here you have to do a variable that it works right, like:
rnd = rndint(x)
rounded = rnd - 1 (rnd > x)
Attachments
roundtest.fsm
(3.37 KiB) Downloaded 867 times
User avatar
Nubeat7
 
Posts: 1347
Joined: Sat Apr 14, 2012 9:59 am
Location: Vienna

Re: rounding stream and the magic NR!?

Postby MyCo » Wed May 15, 2013 7:46 pm

This "magic number" isn't really magic, it's the highest possible 32bit floating point number below 0.5. Or in programmer terms it's the predecessor of 0.5

The exact value is:
dec.: 0.49999997
hex: 0x3EFFFFFF

The hex value of 0.5 is:
0x3F000000

As you can see:
0x3F000000 - 0x3EFFFFFF = 1


But this only works for very low values, for higher values, this type of rounding fails. Because the 32bit accuracy isn't enough.

BTW: If you want to use a really crazy way of rounding, try this code (it's my own invention :twisted: ):
Code: Select all
streamin in;
streamout rounded;

rounded = in - 0.499999 + 8388611 - 8388611;
User avatar
MyCo
 
Posts: 718
Joined: Tue Jul 13, 2010 12:33 pm
Location: Germany

Re: rounding stream and the magic NR!?

Postby Nubeat7 » Wed May 15, 2013 8:34 pm

:) nice one it works with integers till 32 when using bigger numbers it rounds one number down on odd numbers? this is also the case in my example before and 9 is not a big number and the 0.49999997 is also not working on 9.0 but it does with 8.0 (it works under 9 but from there it always rounds down on full odd numbers), why this is happening?
User avatar
Nubeat7
 
Posts: 1347
Joined: Sat Apr 14, 2012 9:59 am
Location: Vienna

Re: rounding stream and the magic NR!?

Postby MyCo » Wed May 15, 2013 9:02 pm

It's very hard to explain. Basically the representation of the real result isn't possible in 32bit floating point number. So there is a rounding to the next possible number.

Some roundings are completely wrong, caused by the processor itself. eg:
Code: Select all
rounded = rndint(8.5);  // returns 8
rounded = rndint(6.5);  // returns 6
User avatar
MyCo
 
Posts: 718
Joined: Tue Jul 13, 2010 12:33 pm
Location: Germany


Return to General

Who is online

Users browsing this forum: No registered users and 75 guests