(root)/
gcc-13.2.0/
libquadmath/
math/
sincosq.c
       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  
      23  void
      24  sincosq (__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  }