Music
July 22, 2011
freeform jam with louie
July 22, 2011
<< | >> | open webamp |
// boring code omitted, see WDL/denormal.h for the full code // WDL_DENORMAL_DOUBLE_HW() is a macro which safely gets you the high 32 bits of a double as an unsigned int. static double WDL_DENORMAL_INLINE denormal_filter_double(double a) { return (WDL_DENORMAL_DOUBLE_HW(&a)&0x7ff00000) ? a : 0.0; }The above code pretty simply looks at the exponent field of the double, and if it is nonzero, returns the double, otherwise it returns 0.
static double WDL_DENORMAL_INLINE denormal_filter_double_aggressive(double a) { return ((WDL_DENORMAL_DOUBLE_HW(&a))&0x7ff00000) >= 0x3c900000 ? a : 0.0; }That was pretty much free (ok slightly larger code, I suppose). One nice thing that became apparent was that we could filter NaN and infinity values this way as well (exponent == 0x7FF), with only the cost of a single integer addition:
static double WDL_DENORMAL_INLINE denormal_filter_double_aggressive(double a) { return ((WDL_DENORMAL_DOUBLE_HW(&a)+0x100000)&0x7ff00000) >= 0x3cA00000 ? a : 0.0; }Note that the exponent is increased by 1, so that 0x7FF becomes 0, and we adjusted the cutoff constant for the change.
where I'm flying through space
hoping there are no power lines
2 Comments