1570af302Sopenharmony_ci#define _GNU_SOURCE 2570af302Sopenharmony_ci#include "libm.h" 3570af302Sopenharmony_ci 4570af302Sopenharmony_ci#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 5570af302Sopenharmony_civoid sincosl(long double x, long double *sin, long double *cos) 6570af302Sopenharmony_ci{ 7570af302Sopenharmony_ci double sind, cosd; 8570af302Sopenharmony_ci sincos(x, &sind, &cosd); 9570af302Sopenharmony_ci *sin = sind; 10570af302Sopenharmony_ci *cos = cosd; 11570af302Sopenharmony_ci} 12570af302Sopenharmony_ci#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 13570af302Sopenharmony_civoid sincosl(long double x, long double *sin, long double *cos) 14570af302Sopenharmony_ci{ 15570af302Sopenharmony_ci union ldshape u = {x}; 16570af302Sopenharmony_ci unsigned n; 17570af302Sopenharmony_ci long double y[2], s, c; 18570af302Sopenharmony_ci 19570af302Sopenharmony_ci u.i.se &= 0x7fff; 20570af302Sopenharmony_ci if (u.i.se == 0x7fff) { 21570af302Sopenharmony_ci *sin = *cos = x - x; 22570af302Sopenharmony_ci return; 23570af302Sopenharmony_ci } 24570af302Sopenharmony_ci if (u.f < M_PI_4) { 25570af302Sopenharmony_ci if (u.i.se < 0x3fff - LDBL_MANT_DIG) { 26570af302Sopenharmony_ci /* raise underflow if subnormal */ 27570af302Sopenharmony_ci if (u.i.se == 0) FORCE_EVAL(x*0x1p-120f); 28570af302Sopenharmony_ci *sin = x; 29570af302Sopenharmony_ci /* raise inexact if x!=0 */ 30570af302Sopenharmony_ci *cos = 1.0 + x; 31570af302Sopenharmony_ci return; 32570af302Sopenharmony_ci } 33570af302Sopenharmony_ci *sin = __sinl(x, 0, 0); 34570af302Sopenharmony_ci *cos = __cosl(x, 0); 35570af302Sopenharmony_ci return; 36570af302Sopenharmony_ci } 37570af302Sopenharmony_ci n = __rem_pio2l(x, y); 38570af302Sopenharmony_ci s = __sinl(y[0], y[1], 1); 39570af302Sopenharmony_ci c = __cosl(y[0], y[1]); 40570af302Sopenharmony_ci switch (n & 3) { 41570af302Sopenharmony_ci case 0: 42570af302Sopenharmony_ci *sin = s; 43570af302Sopenharmony_ci *cos = c; 44570af302Sopenharmony_ci break; 45570af302Sopenharmony_ci case 1: 46570af302Sopenharmony_ci *sin = c; 47570af302Sopenharmony_ci *cos = -s; 48570af302Sopenharmony_ci break; 49570af302Sopenharmony_ci case 2: 50570af302Sopenharmony_ci *sin = -s; 51570af302Sopenharmony_ci *cos = -c; 52570af302Sopenharmony_ci break; 53570af302Sopenharmony_ci case 3: 54570af302Sopenharmony_ci default: 55570af302Sopenharmony_ci *sin = -c; 56570af302Sopenharmony_ci *cos = s; 57570af302Sopenharmony_ci break; 58570af302Sopenharmony_ci } 59570af302Sopenharmony_ci} 60570af302Sopenharmony_ci#endif 61