15b2ba9d3SPiotr Jasiukajtis /*
25b2ba9d3SPiotr Jasiukajtis * CDDL HEADER START
35b2ba9d3SPiotr Jasiukajtis *
45b2ba9d3SPiotr Jasiukajtis * The contents of this file are subject to the terms of the
55b2ba9d3SPiotr Jasiukajtis * Common Development and Distribution License (the "License").
65b2ba9d3SPiotr Jasiukajtis * You may not use this file except in compliance with the License.
75b2ba9d3SPiotr Jasiukajtis *
85b2ba9d3SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95b2ba9d3SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
105b2ba9d3SPiotr Jasiukajtis * See the License for the specific language governing permissions
115b2ba9d3SPiotr Jasiukajtis * and limitations under the License.
125b2ba9d3SPiotr Jasiukajtis *
135b2ba9d3SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
145b2ba9d3SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155b2ba9d3SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
165b2ba9d3SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
175b2ba9d3SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
185b2ba9d3SPiotr Jasiukajtis *
195b2ba9d3SPiotr Jasiukajtis * CDDL HEADER END
205b2ba9d3SPiotr Jasiukajtis */
215b2ba9d3SPiotr Jasiukajtis
225b2ba9d3SPiotr Jasiukajtis /*
235b2ba9d3SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
245b2ba9d3SPiotr Jasiukajtis */
255b2ba9d3SPiotr Jasiukajtis /*
265b2ba9d3SPiotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
275b2ba9d3SPiotr Jasiukajtis * Use is subject to license terms.
285b2ba9d3SPiotr Jasiukajtis */
295b2ba9d3SPiotr Jasiukajtis
30*a9d3dcd5SRichard Lowe #pragma weak __atanhl = atanhl
315b2ba9d3SPiotr Jasiukajtis
325b2ba9d3SPiotr Jasiukajtis #include "libm.h"
335b2ba9d3SPiotr Jasiukajtis
345b2ba9d3SPiotr Jasiukajtis #define GENERIC long double
355b2ba9d3SPiotr Jasiukajtis #define ATANH atanhl
365b2ba9d3SPiotr Jasiukajtis
375b2ba9d3SPiotr Jasiukajtis /* ATANH(x)
385b2ba9d3SPiotr Jasiukajtis * 1 2x x
395b2ba9d3SPiotr Jasiukajtis * ATANH(x) = --- * LOG(1 + -------) = 0.5 * LOG1P(2 * --------)
405b2ba9d3SPiotr Jasiukajtis * 2 1 - x 1 - x
415b2ba9d3SPiotr Jasiukajtis * Note: to guarantee ATANH(-x) = -ATANH(x), we use
425b2ba9d3SPiotr Jasiukajtis * sign(x) |x|
435b2ba9d3SPiotr Jasiukajtis * ATANH(x) = ------- * LOG1P(2*-------).
445b2ba9d3SPiotr Jasiukajtis * 2 1 - |x|
455b2ba9d3SPiotr Jasiukajtis *
465b2ba9d3SPiotr Jasiukajtis * Special cases:
475b2ba9d3SPiotr Jasiukajtis * ATANH(x) is NaN if |x| > 1 with signal;
485b2ba9d3SPiotr Jasiukajtis * ATANH(NaN) is that NaN with no signal;
495b2ba9d3SPiotr Jasiukajtis * ATANH(+-1) is +-INF with signal.
505b2ba9d3SPiotr Jasiukajtis *
515b2ba9d3SPiotr Jasiukajtis */
525b2ba9d3SPiotr Jasiukajtis
535b2ba9d3SPiotr Jasiukajtis #define FABS fabsl
545b2ba9d3SPiotr Jasiukajtis #define LOG1P log1pl
555b2ba9d3SPiotr Jasiukajtis #define COPYSIGN copysignl
565b2ba9d3SPiotr Jasiukajtis
575b2ba9d3SPiotr Jasiukajtis
585b2ba9d3SPiotr Jasiukajtis extern GENERIC FABS(),LOG1P(),COPYSIGN();
595b2ba9d3SPiotr Jasiukajtis
605b2ba9d3SPiotr Jasiukajtis static GENERIC
615b2ba9d3SPiotr Jasiukajtis zero = (GENERIC) 0.0,
625b2ba9d3SPiotr Jasiukajtis half = (GENERIC) 0.5,
635b2ba9d3SPiotr Jasiukajtis one = (GENERIC) 1.0;
645b2ba9d3SPiotr Jasiukajtis
ATANH(x)655b2ba9d3SPiotr Jasiukajtis GENERIC ATANH(x)
665b2ba9d3SPiotr Jasiukajtis GENERIC x;
675b2ba9d3SPiotr Jasiukajtis {
685b2ba9d3SPiotr Jasiukajtis GENERIC t;
695b2ba9d3SPiotr Jasiukajtis t = FABS(x);
705b2ba9d3SPiotr Jasiukajtis if (t == one) return x/zero;
715b2ba9d3SPiotr Jasiukajtis t = t/(one-t);
725b2ba9d3SPiotr Jasiukajtis return COPYSIGN(half,x)*LOG1P(t+t);
735b2ba9d3SPiotr Jasiukajtis }
74