[PATCH RFC 5/5] dsound: convert from fixed to floating point

Chris Robinson chris.kcat at gmail.com
Sun Dec 25 07:56:38 CST 2011

On Saturday, December 24, 2011 9:20:38 PM Alexander E. Patrakov wrote:
> Andrew Eikum converted the buffer position calculation code from fixed
> point to floating point, because floating-point code is more readable.
> I agree with him.

FWIW, I'm not sure using floating point for the position index is that good of 
an idea since it needs to be converted to integer all the time. Float-to-int 
conversions are very slow because it involves reading the FPU control word, 
setting a new control word with the proper rounding mode (which takes several 
cycles), storing the float value as an integer, then setting the old control 
word back (which again takes several cycles). It does this every time a float 
gets converted to an int, and does something similar when you truncate/floor 
the float value.

In addition, you have potential rounding errors caused by precision loss as 
the exponent gets larger. Fixed-point doesn't have this issue since the 
precision is fixed, and the result will always be consistent. E.g.,
val + step*3 == val + step + step + step
is true with fixed-point, but may not be true with floating-point and can 
result in a value that's larger or smaller than you expect. In some 
circumstances, it could even cause you to read past the end of the buffer.

If you're concerned about cleanliness, perhaps some simple inline functions 
could be used to hide the bit-manipulation.

More information about the wine-devel mailing list