Su Windows puoi fare quanto segue:
#include <mmintrin.h>
#define DISABLE_DENORMALS \
int oldMXCSR = _mm_getcsr(); /*read the old MXCSR setting */ \
int newMXCSR = oldMXCSR |= 0x8040; /* set DAZ and FZ bits */ \
_mm_setcsr( newMXCSR ); /* write the new MXCSR setting to the MXCSR */
#define RESTORE_DENORMALS \
_mm_setcsr( oldMXCSR );
Su Mac (o qualsiasi sistema Posix) puoi fare
#include <fenv.h>
#define DISABLE_DENORMALS \
fenv_t fenv; \
fegetenv(&fenv); \
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);
#define RESTORE_DENORMALS \
fesetenv(&fenv);
e puoi usarne uno come
processing_function(...)
{
DISABLE_DENORMALS
// signal processing code
RESTORE_DENORMALS
}
Le negazioni sono piuttosto rare per i calcoli che non hanno feedback; sono piuttosto degenerati. E devi ricordare che corrispondono valori estremamente piccoli. Per qualsiasi calcolo a cui tieni effettivamente a mente quei valori che non vengono svuotati a zero, probabilmente anche a te non importa quanto sia efficiente l'elaborazione.
Le negazioni scaricate a zero sono la cosa giusta da fare per l'audio; inoltre appaiono più spesso di quanto ci si aspetterebbe a causa delle strutture di feedback in decadimento che tendiamo ad avere negli algoritmi audio.
FTZ fa in modo che il risultato del calcolo sia impostato su Zero se il risultato è denormale; ti assicura di non generare denormali.
DAZ fa in modo che gli input per il calcolo siano considerati zero se sono denormali; assicura che i tuoi calcoli non rallentino se l'input passato a te contiene denormali.