Pensavo di dover tornare su questo per aggiungere i seguenti dettagli.
Mentre la risposta che si riferisce alla conversione di uno zero negativo in positivo è vera e mi è stata utile, c'è di più.
L'aggiunta di 1e-18 e quindi la sottrazione da un float annulla effettivamente numeri molto bassi dal float. Questo è usato nelle applicazioni audio perché i filtri possono ricircolare i piccoli galleggianti attraverso funzioni che dividono continuamente i galleggianti, risultando in un numero sempre più piccolo. Una volta che il numero diventa denormalizzato (come menzionato da Caskey), la velocità di elaborazione per quel numero in molti cpu (x86 incluso) diventa fino a 100 volte più lento.
Aggiungendo un numero molto più grande del numero di dimensione di denormale per quel tipo di dati, si cancella il piccolo valore memorizzato nel tipo. Sottraendo lo stesso valore maggiore si ottiene il tipo con zero, che non influisce sulla velocità di elaborazione se elaborato. La ragione per cui cancelli il piccolo valore è che la precisione Significand del tipo non è abbastanza grande da contenere sia il valore molto piccolo, sia il valore più grande che hai appena aggiunto.
Ad esempio:
Inizia con un campione audio con un valore di 1.0f.
Mettere questo attraverso una funzione 40 volte che divide per 10, risultante in un valore di 1e-40.
v = 0.0100000 e-38 (il tipo float ha circa 8 decimali di precisione e un esponente fino a 38, quindi guarda in memoria come l'ho scritto qui).
Questo è ora un valore denormale per un tipo float e farà sì che una CPU lo elabori molto lentamente. Come sbarazzarsi del rallentamento? Rendilo zero. Quindi:
Aggiungi 1e-18; risultato: 1.00000000 e-18 (notare che l'originale 1e-40 è troppo piccolo per essere rappresentato nel significato a 8 cifre e se è già in possesso del valore 1e-18 molto più grande).
Poi sottrarre il valore 1e-18: 0,00 milioni e-0
Perciò abbiamo produrre zero, cancellando il valore denormal originale, e le nostre CPU ci ringrazia.
Sembra che questo sia un codice fortemente ottimizzato che si basa sulla gestione IEEE754 dei numeri denormali con il tipo di dati previsto che il codice sta gestendo (http://en.wikipedia.org/wiki/Denormal_number). Oltre a ciò non posso dare un senso a ciò. – caskey
I numeri denormali di @caskey 'float' sono più piccoli di questo. – ouah