1 /* Emulation for sqrtl. 2 Contributed by Paolo Bonzini 3 4 Copyright 2002-2003, 2007, 2009-2021 Free Software Foundation, Inc. 5 6 This file is part of gnulib. 7 8 This file is free software: you can redistribute it and/or modify 9 it under the terms of the GNU Lesser General Public License as 10 published by the Free Software Foundation; either version 3 of the 11 License, or (at your option) any later version. 12 13 This file is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU Lesser General Public License for more details. 17 18 You should have received a copy of the GNU Lesser General Public License 19 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 20 21 #include <config.h> 22 23 /* Specification. */ 24 #include <math.h> 25 26 #if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE 27 28 long double 29 sqrtl (long double x) /* */ 30 { 31 return sqrt (x); 32 } 33 34 #else 35 36 # include <float.h> 37 38 /* A simple Newton-Raphson method. */ 39 long double 40 sqrtl (long double x) /* */ 41 { 42 long double delta, y; 43 int exponent; 44 45 /* Check for NaN */ 46 if (isnanl (x)) 47 return x; 48 49 /* Check for negative numbers */ 50 if (x < 0.0L) 51 return (long double) sqrt (-1); 52 53 /* Check for zero and infinites */ 54 if (x + x == x) 55 return x; 56 57 frexpl (x, &exponent); 58 y = ldexpl (x, -exponent / 2); 59 60 do 61 { 62 delta = y; 63 y = (y + x / y) * 0.5L; 64 delta -= y; 65 } 66 while (delta != 0.0L); 67 68 return y; 69 } 70 71 #endif