Mercurial > hg > CbC > CbC_gcc
view libquadmath/math/sqrtq.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
#include "quadmath-imp.h" #include <math.h> #include <float.h> __float128 sqrtq (const __float128 x) { __float128 y; int exp; if (isnanq (x) || (isinfq (x) && x > 0)) return x; if (x == 0) return x; if (x < 0) { /* Return NaN with invalid signal. */ return (x - x) / (x - x); } if (x <= DBL_MAX && x >= DBL_MIN) { /* Use double result as starting point. */ y = sqrt ((double) x); /* Two Newton iterations. */ y -= 0.5q * (y - x / y); y -= 0.5q * (y - x / y); return y; } #ifdef HAVE_SQRTL { long double xl = (long double) x; if (xl <= LDBL_MAX && xl >= LDBL_MIN) { /* Use long double result as starting point. */ y = (__float128) sqrtl (xl); /* One Newton iteration. */ y -= 0.5q * (y - x / y); return y; } } #endif /* If we're outside of the range of C types, we have to compute the initial guess the hard way. */ y = frexpq (x, &exp); if (exp % 2) y *= 2, exp--; y = sqrt (y); y = scalbnq (y, exp / 2); /* Two Newton iterations. */ y -= 0.5q * (y - x / y); y -= 0.5q * (y - x / y); return y; }