1 | */* Compute sine and cosine of argument.* |

2 | * Copyright (C) 1997-2017 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, write to the Free* |

19 | * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA* |

20 | * 02111-1307 USA. */* |

21 | |

22 | __#include <errno.h>__ |

23 | __#include "quadmath-imp.h"__ |

24 | |

25 | *void* |

26 | sincosq (**__float128** x, **__float128** *sinx, **__float128** *cosx) |

27 | { |

28 | int64_t ix; |

29 | |

30 | */* High word of x. */* |

31 | GET_FLT128_MSW64 (ix, x); |

32 | |

33 | */* |x| ~< pi/4 */* |

34 | ix &= `0x7fffffffffffffffLL`; |

35 | **if** (ix <= `0x3ffe921fb54442d1LL`) |

36 | __quadmath_kernel_sincosq (x, `0.0Q`, sinx, cosx, `0`); |

37 | **else** **if** (ix >= `0x7fff000000000000LL`) |

38 | { |

39 | */* sin(Inf or NaN) is NaN */* |

40 | *sinx = *cosx = x - x; |

41 | **if** (isinfq (x)) |

42 | errno = EDOM; |

43 | } |

44 | **else** |

45 | { |

46 | */* Argument reduction needed. */* |

47 | **__float128** y[`2`]; |

48 | *int* n; |

49 | |

50 | n = __quadmath_rem_pio2q (x, y); |

51 | **switch** (n & `3`) |

52 | { |

53 | **case** `0`: |

54 | __quadmath_kernel_sincosq (y[`0`], y[`1`], sinx, cosx, `1`); |

55 | **break**; |

56 | **case** `1`: |

57 | __quadmath_kernel_sincosq (y[`0`], y[`1`], cosx, sinx, `1`); |

58 | *cosx = -*cosx; |

59 | **break**; |

60 | **case** `2`: |

61 | __quadmath_kernel_sincosq (y[`0`], y[`1`], sinx, cosx, `1`); |

62 | *sinx = -*sinx; |

63 | *cosx = -*cosx; |

64 | **break**; |

65 | **default**: |

66 | __quadmath_kernel_sincosq (y[`0`], y[`1`], cosx, sinx, `1`); |

67 | *sinx = -*sinx; |

68 | **break**; |

69 | } |

70 | } |

71 | } |

72 | |