1 | */* Return arc hyperbole tangent for __float128 value.* |

2 | * Copyright (C) 1997, 1998 Free Software Foundation, Inc.* |

3 | * This file is part of the GNU C Library.* |

4 | * Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.* |

5 | |

6 | * The GNU C Library is free software; you can redistribute it and/or* |

7 | * modify it under the terms of the GNU Lesser General Public* |

8 | * License as published by the Free Software Foundation; either* |

9 | * version 2.1 of the License, or (at your option) any later version.* |

10 | |

11 | * The GNU C Library is distributed in the hope that it will be useful,* |

12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of* |

13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU* |

14 | * Lesser General Public License for more details.* |

15 | |

16 | * You should have received a copy of the GNU Lesser General Public* |

17 | * License along with the GNU C Library; if not, write to the Free* |

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

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

20 | |

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

22 | |

23 | |

24 | __complex128 |

25 | catanhq (__complex128 x) |

26 | { |

27 | __complex128 res; |

28 | *int* rcls = fpclassifyq (**__real__** x); |

29 | *int* icls = fpclassifyq (**__imag__** x); |

30 | |

31 | **if** (rcls <= QUADFP_INFINITE || icls <= QUADFP_INFINITE) |

32 | { |

33 | **if** (icls == QUADFP_INFINITE) |

34 | { |

35 | **__real__** res = copysignq (`0.0`, **__real__** x); |

36 | **__imag__** res = copysignq (M_PI_2q, **__imag__** x); |

37 | } |

38 | **else** **if** (rcls == QUADFP_INFINITE || rcls == QUADFP_ZERO) |

39 | { |

40 | **__real__** res = copysignq (`0.0`, **__real__** x); |

41 | **if** (icls >= QUADFP_ZERO) |

42 | **__imag__** res = copysignq (M_PI_2q, **__imag__** x); |

43 | **else** |

44 | **__imag__** res = nanq ("" ); |

45 | } |

46 | **else** |

47 | { |

48 | **__real__** res = nanq ("" ); |

49 | **__imag__** res = nanq ("" ); |

50 | } |

51 | } |

52 | **else** **if** (rcls == QUADFP_ZERO && icls == QUADFP_ZERO) |

53 | { |

54 | res = x; |

55 | } |

56 | **else** |

57 | { |

58 | **__float128** i2, num, den; |

59 | |

60 | i2 = **__imag__** x * **__imag__** x; |

61 | |

62 | num = `1.0` + **__real__** x; |

63 | num = i2 + num * num; |

64 | |

65 | den = `1.0` - **__real__** x; |

66 | den = i2 + den * den; |

67 | |

68 | **__real__** res = `0.25` * (logq (num) - logq (den)); |

69 | |

70 | den = `1` - **__real__** x * **__real__** x - i2; |

71 | |

72 | **__imag__** res = `0.5` * atan2q (`2.0` * **__imag__** x, den); |

73 | } |

74 | |

75 | **return** res; |

76 | } |

77 | |