125c28e83SPiotr Jasiukajtis /* 225c28e83SPiotr Jasiukajtis * CDDL HEADER START 325c28e83SPiotr Jasiukajtis * 425c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the 525c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License"). 625c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License. 725c28e83SPiotr Jasiukajtis * 825c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 925c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing. 1025c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions 1125c28e83SPiotr Jasiukajtis * and limitations under the License. 1225c28e83SPiotr Jasiukajtis * 1325c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each 1425c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1525c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the 1625c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying 1725c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner] 1825c28e83SPiotr Jasiukajtis * 1925c28e83SPiotr Jasiukajtis * CDDL HEADER END 2025c28e83SPiotr Jasiukajtis */ 2125c28e83SPiotr Jasiukajtis /* 2225c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 2325c28e83SPiotr Jasiukajtis */ 2425c28e83SPiotr Jasiukajtis /* 2525c28e83SPiotr Jasiukajtis * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 2625c28e83SPiotr Jasiukajtis * Use is subject to license terms. 2725c28e83SPiotr Jasiukajtis */ 2825c28e83SPiotr Jasiukajtis 29*ddc0e0b5SRichard Lowe #pragma weak __cosh = cosh 3025c28e83SPiotr Jasiukajtis 3125c28e83SPiotr Jasiukajtis /* INDENT OFF */ 3225c28e83SPiotr Jasiukajtis /* 3325c28e83SPiotr Jasiukajtis * cosh(x) 3425c28e83SPiotr Jasiukajtis * Code originated from 4.3bsd. 3525c28e83SPiotr Jasiukajtis * Modified by K.C. Ng for SUN 4.0 libm. 3625c28e83SPiotr Jasiukajtis * Method : 3725c28e83SPiotr Jasiukajtis * 1. Replace x by |x| (cosh(x) = cosh(-x)). 3825c28e83SPiotr Jasiukajtis * 2. 3925c28e83SPiotr Jasiukajtis * [ exp(x) - 1 ]^2 4025c28e83SPiotr Jasiukajtis * 0 <= x <= 0.3465 : cosh(x) := 1 + ------------------- 4125c28e83SPiotr Jasiukajtis * 2*exp(x) 4225c28e83SPiotr Jasiukajtis * 4325c28e83SPiotr Jasiukajtis * exp(x) + 1/exp(x) 4425c28e83SPiotr Jasiukajtis * 0.3465 <= x <= 22 : cosh(x) := ------------------- 4525c28e83SPiotr Jasiukajtis * 2 4625c28e83SPiotr Jasiukajtis * 22 <= x <= lnovft : cosh(x) := exp(x)/2 4725c28e83SPiotr Jasiukajtis * lnovft <= x < INF : cosh(x) := scalbn(exp(x-1024*ln2),1023) 4825c28e83SPiotr Jasiukajtis * 4925c28e83SPiotr Jasiukajtis * Note: .3465 is a number near one half of ln2. 5025c28e83SPiotr Jasiukajtis * 5125c28e83SPiotr Jasiukajtis * Special cases: 5225c28e83SPiotr Jasiukajtis * cosh(x) is |x| if x is +INF, -INF, or NaN. 5325c28e83SPiotr Jasiukajtis * only cosh(0)=1 is exact for finite x. 5425c28e83SPiotr Jasiukajtis */ 5525c28e83SPiotr Jasiukajtis /* INDENT ON */ 5625c28e83SPiotr Jasiukajtis 5725c28e83SPiotr Jasiukajtis #include "libm.h" 5825c28e83SPiotr Jasiukajtis 5925c28e83SPiotr Jasiukajtis static const double 6025c28e83SPiotr Jasiukajtis ln2 = 6.93147180559945286227e-01, 6125c28e83SPiotr Jasiukajtis ln2hi = 6.93147180369123816490e-01, 6225c28e83SPiotr Jasiukajtis ln2lo = 1.90821492927058770002e-10, 6325c28e83SPiotr Jasiukajtis lnovft = 7.09782712893383973096e+02; 6425c28e83SPiotr Jasiukajtis 6525c28e83SPiotr Jasiukajtis double 6625c28e83SPiotr Jasiukajtis cosh(double x) { 6725c28e83SPiotr Jasiukajtis double t, w; 6825c28e83SPiotr Jasiukajtis 6925c28e83SPiotr Jasiukajtis w = fabs(x); 7025c28e83SPiotr Jasiukajtis if (!finite(w)) 7125c28e83SPiotr Jasiukajtis return (w * w); 7225c28e83SPiotr Jasiukajtis if (w < 0.3465) { 7325c28e83SPiotr Jasiukajtis t = expm1(w); 7425c28e83SPiotr Jasiukajtis w = 1.0 + t; 7525c28e83SPiotr Jasiukajtis if (w != 1.0) 7625c28e83SPiotr Jasiukajtis w = 1.0 + (t * t) / (w + w); 7725c28e83SPiotr Jasiukajtis return (w); 7825c28e83SPiotr Jasiukajtis } else if (w < 22.0) { 7925c28e83SPiotr Jasiukajtis t = exp(w); 8025c28e83SPiotr Jasiukajtis return (0.5 * (t + 1.0 / t)); 8125c28e83SPiotr Jasiukajtis } else if (w <= lnovft) { 8225c28e83SPiotr Jasiukajtis return (0.5 * exp(w)); 8325c28e83SPiotr Jasiukajtis } else { 8425c28e83SPiotr Jasiukajtis w = (w - 1024 * ln2hi) - 1024 * ln2lo; 8525c28e83SPiotr Jasiukajtis if (w >= ln2) 8625c28e83SPiotr Jasiukajtis return (_SVID_libm_err(x, x, 5)); 8725c28e83SPiotr Jasiukajtis else 8825c28e83SPiotr Jasiukajtis return (scalbn(exp(w), 1023)); 8925c28e83SPiotr Jasiukajtis } 9025c28e83SPiotr Jasiukajtis } 91