[linux-audio-dev] swh plugins and fixing undenormalize
Simon Jenkins
sjenkins at blueyonder.co.uk
Thu Jun 24 09:37:35 UTC 2004
Erik de Castro Lopo wrote:
>On Thu, 24 Jun 2004 02:11:34 -0300
>Juan Linietsky <coding at reduz.com.ar> wrote:
>
>
>
>>Sorry for not checking, but I guess it could be good for the record (and
>>people googling for it) to ask here..
>>The macro for dealing denormals that I have is:
>>
>>#define undenormalise(sample) if(((*(unsigned int*)&sample)&0x7f800000)==0)
>>sample=0.0f
>>
>>however gcc 3.3 and 3.4 seem to produce an undesired effect
>>when the optimizer is turned on, rendering this macro unusable..
>>this breaks freeverb and a few other stuff I have that uses it.
>>
>>How was/is this fixed properly?
>>
>>
>
>Personally, I think that macro is rather silly. You bascially end up
>forcing data that would otherwise be in the floating point pipeline
>into the integer pipeline and then latter, it probably goes back into
>the FP pipeline. Secondly, it contains a branch which is usually far
>from optimal.
>
>
>
I (re)discovered the following branch-free method a while ago:
/* branch-free denormal killer (slightly blunt) */
inline float FlushToZero( volatile float f )
{
f += 9.8607615E-32f;
return f - 9.8607615E-32f;
}
/* end */
The people who discovered it first call this method
"Elimination by Quantification".
Its slightly blunt because it damages the precision of
extremely low but not yet denormal numbers: Anything
of magnitude < 2 ** -103 loses one bit of precision for
each binary order of magnitude it is below that number.
(This means that denormal numbers lose /all/ of their
precision and become zero).
Simon Jenkins
(Bristol, UK)
More information about the Linux-audio-dev
mailing list