1/* Compute sine and cosine of argument. 2 Copyright (C) 1997-2018 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and 5 Jakub Jelinek <jj@ultra.linux.cz>. 6 7 The GNU C Library is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public 9 License as published by the Free Software Foundation; either 10 version 2.1 of the License, or (at your option) any later version. 11 12 The GNU C Library is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 Lesser General Public License for more details. 16 17 You should have received a copy of the GNU Lesser General Public 18 License along with the GNU C Library; if not, see 19 <http://www.gnu.org/licenses/>. */ 20 21#include "quadmath-imp.h" 22 23void 24sincosq (__float128 x, __float128 *sinx, __float128 *cosx) 25{ 26 int64_t ix; 27 28 /* High word of x. */ 29 GET_FLT128_MSW64 (ix, x); 30 31 /* |x| ~< pi/4 */ 32 ix &= 0x7fffffffffffffffLL; 33 if (ix <= 0x3ffe921fb54442d1LL) 34 __quadmath_kernel_sincosq (x, 0, sinx, cosx, 0); 35 else if (ix >= 0x7fff000000000000LL) 36 { 37 /* sin(Inf or NaN) is NaN */ 38 *sinx = *cosx = x - x; 39 if (isinfq (x)) 40 errno = EDOM; 41 } 42 else 43 { 44 /* Argument reduction needed. */ 45 __float128 y[2]; 46 int n; 47 48 n = __quadmath_rem_pio2q (x, y); 49 switch (n & 3) 50 { 51 case 0: 52 __quadmath_kernel_sincosq (y[0], y[1], sinx, cosx, 1); 53 break; 54 case 1: 55 __quadmath_kernel_sincosq (y[0], y[1], cosx, sinx, 1); 56 *cosx = -*cosx; 57 break; 58 case 2: 59 __quadmath_kernel_sincosq (y[0], y[1], sinx, cosx, 1); 60 *sinx = -*sinx; 61 *cosx = -*cosx; 62 break; 63 default: 64 __quadmath_kernel_sincosq (y[0], y[1], cosx, sinx, 1); 65 *sinx = -*sinx; 66 break; 67 } 68 } 69} 70