Fix bug #613: psqrt was incorrect for small numbers

(transplanted from d5fa5001a7c6ba3ea29c5a4f18aebb8c1ec71dd6
)
This commit is contained in:
Jeff Dean 2013-06-13 18:17:27 +02:00
parent 21826e9e53
commit 5dca39eb8b

View File

@ -374,7 +374,7 @@ Packet4f psqrt<Packet4f>(const Packet4f& _x)
Packet4f half = pmul(_x, pset1<Packet4f>(.5f));
/* select only the inverse sqrt of non-zero inputs */
Packet4f non_zero_mask = _mm_cmpgt_ps(_x, pset1<Packet4f>(std::numeric_limits<float>::epsilon()));
Packet4f non_zero_mask = _mm_cmpgt_ps(_x, pset1<Packet4f>((std::numeric_limits<float>::min)()));
Packet4f x = _mm_and_ps(non_zero_mask, _mm_rsqrt_ps(_x));
x = pmul(x, psub(pset1<Packet4f>(1.5f), pmul(half, pmul(x,x))));