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