OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libm/] [mathfp/] [e_acosh.c] - Diff between revs 207 and 345

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
 
 
/* @(#)e_acosh.c 5.1 93/09/24 */
/* @(#)e_acosh.c 5.1 93/09/24 */
 
 
/*
/*
FUNCTION
FUNCTION
<<acosh>>, <<acoshf>>---inverse hyperbolic cosine
<<acosh>>, <<acoshf>>---inverse hyperbolic cosine
 
 
INDEX
INDEX
acosh
acosh
INDEX
INDEX
acoshf
acoshf
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <math.h>
        #include <math.h>
        double acosh(double <[x]>);
        double acosh(double <[x]>);
        float acoshf(float <[x]>);
        float acoshf(float <[x]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <math.h>
        #include <math.h>
        double acosh(<[x]>)
        double acosh(<[x]>)
        double <[x]>;
        double <[x]>;
 
 
        float acoshf(<[x]>)
        float acoshf(<[x]>)
        float <[x]>;
        float <[x]>;
 
 
DESCRIPTION
DESCRIPTION
<<acosh>> calculates the inverse hyperbolic cosine of <[x]>.
<<acosh>> calculates the inverse hyperbolic cosine of <[x]>.
<<acosh>> is defined as
<<acosh>> is defined as
@ifnottex
@ifnottex
. log(<[x]> + sqrt(<[x]>*<[x]>-1))
. log(<[x]> + sqrt(<[x]>*<[x]>-1))
@end ifnottex
@end ifnottex
@tex
@tex
$$ln\Bigl(x + \sqrt{x^2-1}\Bigr)$$
$$ln\Bigl(x + \sqrt{x^2-1}\Bigr)$$
@end tex
@end tex
 
 
<[x]> must be a number greater than or equal to 1.
<[x]> must be a number greater than or equal to 1.
 
 
<<acoshf>> is identical, other than taking and returning floats.
<<acoshf>> is identical, other than taking and returning floats.
 
 
RETURNS
RETURNS
<<acosh>> and <<acoshf>> return the calculated value.  If <[x]>
<<acosh>> and <<acoshf>> return the calculated value.  If <[x]>
less than 1, the return value is NaN and <<errno>> is set to <<EDOM>>.
less than 1, the return value is NaN and <<errno>> is set to <<EDOM>>.
 
 
You can change the error-handling behavior with the non-ANSI
You can change the error-handling behavior with the non-ANSI
<<matherr>> function.
<<matherr>> function.
 
 
PORTABILITY
PORTABILITY
Neither <<acosh>> nor <<acoshf>> are ANSI C.  They are not recommended
Neither <<acosh>> nor <<acoshf>> are ANSI C.  They are not recommended
for portable programs.
for portable programs.
 
 
 
 
QUICKREF ANSI SVID POSIX RENTRANT
QUICKREF ANSI SVID POSIX RENTRANT
 acos    n,n,n,m
 acos    n,n,n,m
 acosf   n,n,n,m
 acosf   n,n,n,m
 
 
MATHREF
MATHREF
 acosh, NAN,   arg,DOMAIN,EDOM
 acosh, NAN,   arg,DOMAIN,EDOM
 acosh, < 1.0, NAN,DOMAIN,EDOM
 acosh, < 1.0, NAN,DOMAIN,EDOM
 acosh, >=1.0, acosh(arg),,,
 acosh, >=1.0, acosh(arg),,,
 
 
MATHREF
MATHREF
 acoshf, NAN,   arg,DOMAIN,EDOM
 acoshf, NAN,   arg,DOMAIN,EDOM
 acoshf, < 1.0, NAN,DOMAIN,EDOM
 acoshf, < 1.0, NAN,DOMAIN,EDOM
 acoshf, >=1.0, acosh(arg),,,
 acoshf, >=1.0, acosh(arg),,,
 
 
*/
*/
 
 
/*
/*
 * ====================================================
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * software is freely granted, provided that this notice
 * is preserved.
 * is preserved.
 * ====================================================
 * ====================================================
 *
 *
 */
 */
 
 
/* acosh(x)
/* acosh(x)
 * Method :
 * Method :
 *      Based on
 *      Based on
 *              acosh(x) = log [ x + sqrt(x*x-1) ]
 *              acosh(x) = log [ x + sqrt(x*x-1) ]
 *      we have
 *      we have
 *              acosh(x) := log(x)+ln2, if x is large; else
 *              acosh(x) := log(x)+ln2, if x is large; else
 *              acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
 *              acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
 *              acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
 *              acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
 *
 *
 * Special cases:
 * Special cases:
 *      acosh(x) is NaN with signal if x<1.
 *      acosh(x) is NaN with signal if x<1.
 *      acosh(NaN) is NaN without signal.
 *      acosh(NaN) is NaN without signal.
 */
 */
 
 
#include "fdlibm.h"
#include "fdlibm.h"
 
 
#ifndef _DOUBLE_IS_32BITS
#ifndef _DOUBLE_IS_32BITS
 
 
#ifdef __STDC__
#ifdef __STDC__
static const double
static const double
#else
#else
static double
static double
#endif
#endif
one     = 1.0,
one     = 1.0,
ln2     = 6.93147180559945286227e-01;  /* 0x3FE62E42, 0xFEFA39EF */
ln2     = 6.93147180559945286227e-01;  /* 0x3FE62E42, 0xFEFA39EF */
 
 
#ifdef __STDC__
#ifdef __STDC__
        double acosh(double x)
        double acosh(double x)
#else
#else
        double acosh(x)
        double acosh(x)
        double x;
        double x;
#endif
#endif
{
{
        double t;
        double t;
        __int32_t hx;
        __int32_t hx;
        __uint32_t lx;
        __uint32_t lx;
        EXTRACT_WORDS(hx,lx,x);
        EXTRACT_WORDS(hx,lx,x);
        if(hx<0x3ff00000) {             /* x < 1 */
        if(hx<0x3ff00000) {             /* x < 1 */
            return (x-x)/(x-x);
            return (x-x)/(x-x);
        } else if(hx >=0x41b00000) {    /* x > 2**28 */
        } else if(hx >=0x41b00000) {    /* x > 2**28 */
            if(hx >=0x7ff00000) {       /* x is inf of NaN */
            if(hx >=0x7ff00000) {       /* x is inf of NaN */
                return x+x;
                return x+x;
            } else
            } else
                return log(x)+ln2;      /* acosh(huge)=log(2x) */
                return log(x)+ln2;      /* acosh(huge)=log(2x) */
        } else if(((hx-0x3ff00000)|lx)==0) {
        } else if(((hx-0x3ff00000)|lx)==0) {
            return 0.0;                 /* acosh(1) = 0 */
            return 0.0;                 /* acosh(1) = 0 */
        } else if (hx > 0x40000000) {   /* 2**28 > x > 2 */
        } else if (hx > 0x40000000) {   /* 2**28 > x > 2 */
            t=x*x;
            t=x*x;
            return log(2.0*x-one/(x+sqrt(t-one)));
            return log(2.0*x-one/(x+sqrt(t-one)));
        } else {                        /* 1<x<2 */
        } else {                        /* 1<x<2 */
            t = x-one;
            t = x-one;
            return log1p(t+sqrt(2.0*t+t*t));
            return log1p(t+sqrt(2.0*t+t*t));
        }
        }
}
}
 
 
#endif /* defined(_DOUBLE_IS_32BITS) */
#endif /* defined(_DOUBLE_IS_32BITS) */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.