sto leggendo questo documento: http://software.intel.com/en-us/articles/interactive-ray-tracingNewton Raphson con SSE2 - qualcuno mi può spiegare queste 3 righe
e sono incappato in queste tre righe di codice:
La versione SIMD è già un bel un po 'più veloce, ma possiamo fare di meglio. Intel ha aggiunto una funzione veloce 1/sqrt (x) al set di istruzioni SSE2. L'unico inconveniente è che la sua precisione è limitata. Abbiamo bisogno della precisione , quindi affiniamo utilizzando Newton-Rhapson:
__m128 nr = _mm_rsqrt_ps(x);
__m128 muls = _mm_mul_ps(_mm_mul_ps(x, nr), nr);
result = _mm_mul_ps(_mm_mul_ps(half, nr), _mm_sub_ps(three, muls));
Questo codice presuppone l'esistenza di una variabile __m128 denominata 'metà' (quattro volte 0.5f) e una variabile ' tre '(quattro volte 3.0f).
So come utilizzare Newton Raphson per calcolare lo zero di una funzione e so come utilizzarlo per calcolare la radice quadrata di un numero ma non riesco a vedere come questo codice lo esegue.
Qualcuno può spiegarmelo per favore?
Quando si tronca in numero intero, si ritiene che sarebbe fattibile come passaggio finale per aggiungere un valore che ha lo stesso esponente del risultato ma solo i bit più bassi (o due?) Impostati nel significato e? Questo è ovviamente a condizione che la cifra meno significativa sia sempre inferiore alla posizione di una persona. – chili
Dipende dall'applicazione. Il punto è che quando si usa un approccio iterativo 'sqrt (n * n) == n' non regge sempre. Questo non può essere "riparato" arbitrariamente - come "sqrt (n * n - epsilon) == n' può portare al disastro. –