Credo che la risposta di Paolo è bello, ma non riesce per v = 4294967295U (= 2^32-1). In questo caso v2 = 2^31-1 e v1 = 2^31. _mm_cvtepi32_ps intrinseco converte da 2^31 a -2.14748365E9. v2 = 2^31-1 viene convertito in 2.14748365E9 e di conseguenza _mm_add_ps
restituisce 0 (a causa dell'arrotondamento v1f e v2f sono l'esatto contrario dell'altro).
L'idea della soluzione seguente è copiare il bit più significativo di v in v_high. Gli altri bit di v sono copiati in v_low. v_high viene convertito in 0 o 2.14748365E9.
inline __m128 _mm_cvtepu32_v3_ps(const __m128i v)
{
__m128i msk0=_mm_set1_epi32(0x7FFFFFFF);
__m128i zero=_mm_xor_si128(msk0,msk0);
__m128i cnst2_31=_mm_set1_epi32(0x4F000000); /* IEEE representation of float 2^31 */
__m128i v_high=_mm_andnot_si128(msk0,v);
__m128i v_low=_mm_and_si128(msk0,v);
__m128 v_lowf=_mm_cvtepi32_ps(v_low);
__m128i msk1=_mm_cmpeq_epi32(v_high,zero);
__m128 v_highf=_mm_castsi128_ps(_mm_andnot_si128(msk1,cnst2_31));
__m128 v_sum=_mm_add_ps(v_lowf,v_highf);
return v_sum;
}
Aggiornamento
è stato possibile ridurre il numero di istruzioni:
inline __m128 _mm_cvtepu32_v4_ps(const __m128i v)
{
__m128i msk0=_mm_set1_epi32(0x7FFFFFFF);
__m128i cnst2_31=_mm_set1_epi32(0x4F000000);
__m128i msk1=_mm_srai_epi32(v,31);
__m128i v_low=_mm_and_si128(msk0,v);
__m128 v_lowf=_mm_cvtepi32_ps(v_low);
__m128 v_highf=_mm_castsi128_ps(_mm_and_si128(msk1,cnst2_31));
__m128 v_sum=_mm_add_ps(v_lowf,v_highf);
return v_sum;
}
intrinseca _mm_srai_epi32
sposta il bit più significativo del v a destra, mentre si spostano i bit del segno, che risulta essere piuttosto utile h ere.
Se si utilizza 'int' a 32 bit, il valore positivo massimo è' 2147483647' in modo che il numero '2480160505' non possa essere rappresentato come' signed int'. –
Immagino che l'OP significhi '2480160505U'? –
Se i tuoi valori sono noti per essere in un intervallo limitato (penso '[0 .. 2^23]', poiché single-precision ha una mantissa a 23 bit, prova una versione a 32 bit di Mysticial's [64 bit non firmati da/per doppio] (http://stackoverflow.com/a/41148578/224132). Spiega il metodo abbastanza bene da essere in grado di trovare le costanti giuste per far funzionare il tratteggio del bit pattern IEEE-754. –