OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [newlib-1.17.0/] [newlib/] [libm/] [mathfp/] [w_jn.c] - Diff between revs 148 and 158

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

Rev 148 Rev 158
 
 
/* @(#)w_jn.c 5.1 93/09/24 */
/* @(#)w_jn.c 5.1 93/09/24 */
/*
/*
 * ====================================================
 * ====================================================
 * 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.
 * ====================================================
 * ====================================================
 */
 */
 
 
/*
/*
FUNCTION
FUNCTION
<<jN>>, <<jNf>>, <<yN>>, <<yNf>>---Bessel functions
<<jN>>, <<jNf>>, <<yN>>, <<yNf>>---Bessel functions
 
 
INDEX
INDEX
j0
j0
INDEX
INDEX
j0f
j0f
INDEX
INDEX
j1
j1
INDEX
INDEX
j1f
j1f
INDEX
INDEX
jn
jn
INDEX
INDEX
jnf
jnf
INDEX
INDEX
y0
y0
INDEX
INDEX
y0f
y0f
INDEX
INDEX
y1
y1
INDEX
INDEX
y1f
y1f
INDEX
INDEX
yn
yn
INDEX
INDEX
ynf
ynf
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
#include <math.h>
#include <math.h>
double j0(double <[x]>);
double j0(double <[x]>);
float j0f(float <[x]>);
float j0f(float <[x]>);
double j1(double <[x]>);
double j1(double <[x]>);
float j1f(float <[x]>);
float j1f(float <[x]>);
double jn(int <[n]>, double <[x]>);
double jn(int <[n]>, double <[x]>);
float jnf(int <[n]>, float <[x]>);
float jnf(int <[n]>, float <[x]>);
double y0(double <[x]>);
double y0(double <[x]>);
float y0f(float <[x]>);
float y0f(float <[x]>);
double y1(double <[x]>);
double y1(double <[x]>);
float y1f(float <[x]>);
float y1f(float <[x]>);
double yn(int <[n]>, double <[x]>);
double yn(int <[n]>, double <[x]>);
float ynf(int <[n]>, float <[x]>);
float ynf(int <[n]>, float <[x]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
#include <math.h>
#include <math.h>
 
 
double j0(<[x]>)
double j0(<[x]>)
double <[x]>;
double <[x]>;
float j0f(<[x]>)
float j0f(<[x]>)
float <[x]>;
float <[x]>;
double j1(<[x]>)
double j1(<[x]>)
double <[x]>;
double <[x]>;
float j1f(<[x]>)
float j1f(<[x]>)
float <[x]>;
float <[x]>;
double jn(<[n]>, <[x]>)
double jn(<[n]>, <[x]>)
int <[n]>;
int <[n]>;
double <[x]>;
double <[x]>;
float jnf(<[n]>, <[x]>)
float jnf(<[n]>, <[x]>)
int <[n]>;
int <[n]>;
float <[x]>;
float <[x]>;
 
 
double y0(<[x]>)
double y0(<[x]>)
double <[x]>;
double <[x]>;
float y0f(<[x]>)
float y0f(<[x]>)
float <[x]>;
float <[x]>;
double y1(<[x]>)
double y1(<[x]>)
double <[x]>;
double <[x]>;
float y1f(<[x]>)
float y1f(<[x]>)
float <[x]>;
float <[x]>;
double yn(<[n]>, <[x]>)
double yn(<[n]>, <[x]>)
int <[n]>;
int <[n]>;
double <[x]>;
double <[x]>;
float ynf(<[n]>, <[x]>)
float ynf(<[n]>, <[x]>)
int <[n]>;
int <[n]>;
float <[x]>;
float <[x]>;
 
 
DESCRIPTION
DESCRIPTION
The Bessel functions are a family of functions that solve the
The Bessel functions are a family of functions that solve the
differential equation
differential equation
@ifnottex
@ifnottex
.  2               2    2
.  2               2    2
. x  y'' + xy' + (x  - p )y  = 0
. x  y'' + xy' + (x  - p )y  = 0
@end ifnottex
@end ifnottex
@tex
@tex
$$x^2{d^2y\over dx^2} + x{dy\over dx} + (x^2-p^2)y = 0$$
$$x^2{d^2y\over dx^2} + x{dy\over dx} + (x^2-p^2)y = 0$$
@end tex
@end tex
These functions have many applications in engineering and physics.
These functions have many applications in engineering and physics.
 
 
<<jn>> calculates the Bessel function of the first kind of order
<<jn>> calculates the Bessel function of the first kind of order
<[n]>.  <<j0>> and <<j1>> are special cases for order 0 and order
<[n]>.  <<j0>> and <<j1>> are special cases for order 0 and order
1 respectively.
1 respectively.
 
 
Similarly, <<yn>> calculates the Bessel function of the second kind of
Similarly, <<yn>> calculates the Bessel function of the second kind of
order <[n]>, and <<y0>> and <<y1>> are special cases for order 0 and
order <[n]>, and <<y0>> and <<y1>> are special cases for order 0 and
1.
1.
 
 
<<jnf>>, <<j0f>>, <<j1f>>, <<ynf>>, <<y0f>>, and <<y1f>> perform the
<<jnf>>, <<j0f>>, <<j1f>>, <<ynf>>, <<y0f>>, and <<y1f>> perform the
same calculations, but on <<float>> rather than <<double>> values.
same calculations, but on <<float>> rather than <<double>> values.
 
 
RETURNS
RETURNS
The value of each Bessel function at <[x]> is returned.
The value of each Bessel function at <[x]> is returned.
 
 
PORTABILITY
PORTABILITY
None of the Bessel functions are in ANSI C.
None of the Bessel functions are in ANSI C.
*/
*/
 
 
/*
/*
 * wrapper jn(int n, double x), yn(int n, double x)
 * wrapper jn(int n, double x), yn(int n, double x)
 * floating point Bessel's function of the 1st and 2nd kind
 * floating point Bessel's function of the 1st and 2nd kind
 * of order n
 * of order n
 *
 *
 * Special cases:
 * Special cases:
 *      y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
 *      y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
 *      y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
 *      y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
 * Note 2. About jn(n,x), yn(n,x)
 * Note 2. About jn(n,x), yn(n,x)
 *      For n=0, j0(x) is called,
 *      For n=0, j0(x) is called,
 *      for n=1, j1(x) is called,
 *      for n=1, j1(x) is called,
 *      for n<x, forward recursion us used starting
 *      for n<x, forward recursion us used starting
 *      from values of j0(x) and j1(x).
 *      from values of j0(x) and j1(x).
 *      for n>x, a continued fraction approximation to
 *      for n>x, a continued fraction approximation to
 *      j(n,x)/j(n-1,x) is evaluated and then backward
 *      j(n,x)/j(n-1,x) is evaluated and then backward
 *      recursion is used starting from a supposed value
 *      recursion is used starting from a supposed value
 *      for j(n,x). The resulting value of j(0,x) is
 *      for j(n,x). The resulting value of j(0,x) is
 *      compared with the actual value to correct the
 *      compared with the actual value to correct the
 *      supposed value of j(n,x).
 *      supposed value of j(n,x).
 *
 *
 *      yn(n,x) is similar in all respects, except
 *      yn(n,x) is similar in all respects, except
 *      that forward recursion is used for all
 *      that forward recursion is used for all
 *      values of n>1.
 *      values of n>1.
 *
 *
 */
 */
 
 
#include "fdlibm.h"
#include "fdlibm.h"
#include <errno.h>
#include <errno.h>
 
 
#ifndef _DOUBLE_IS_32BITS
#ifndef _DOUBLE_IS_32BITS
 
 
#ifdef __STDC__
#ifdef __STDC__
        double jn(int n, double x)      /* wrapper jn */
        double jn(int n, double x)      /* wrapper jn */
#else
#else
        double jn(n,x)                  /* wrapper jn */
        double jn(n,x)                  /* wrapper jn */
        double x; int n;
        double x; int n;
#endif
#endif
{
{
#ifdef _IEEE_LIBM
#ifdef _IEEE_LIBM
        return jn(n,x);
        return jn(n,x);
#else
#else
        double z;
        double z;
        struct exception exc;
        struct exception exc;
        z = jn(n,x);
        z = jn(n,x);
        if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
        if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
        if(fabs(x)>X_TLOSS) {
        if(fabs(x)>X_TLOSS) {
            /* jn(|x|>X_TLOSS) */
            /* jn(|x|>X_TLOSS) */
            exc.type = TLOSS;
            exc.type = TLOSS;
            exc.name = "jn";
            exc.name = "jn";
            exc.err = 0;
            exc.err = 0;
            exc.arg1 = n;
            exc.arg1 = n;
            exc.arg2 = x;
            exc.arg2 = x;
            exc.retval = 0.0;
            exc.retval = 0.0;
            if (_LIB_VERSION == _POSIX_)
            if (_LIB_VERSION == _POSIX_)
                errno = ERANGE;
                errno = ERANGE;
            else if (!matherr(&exc)) {
            else if (!matherr(&exc)) {
               errno = ERANGE;
               errno = ERANGE;
            }
            }
            if (exc.err != 0)
            if (exc.err != 0)
               errno = exc.err;
               errno = exc.err;
            return exc.retval;
            return exc.retval;
        } else
        } else
            return z;
            return z;
#endif
#endif
}
}
 
 
#ifdef __STDC__
#ifdef __STDC__
        double yn(int n, double x)      /* wrapper yn */
        double yn(int n, double x)      /* wrapper yn */
#else
#else
        double yn(n,x)                  /* wrapper yn */
        double yn(n,x)                  /* wrapper yn */
        double x; int n;
        double x; int n;
#endif
#endif
{
{
#ifdef _IEEE_LIBM
#ifdef _IEEE_LIBM
        return yn(n,x);
        return yn(n,x);
#else
#else
        double z;
        double z;
        struct exception exc;
        struct exception exc;
        z = yn(n,x);
        z = yn(n,x);
        if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
        if(_LIB_VERSION == _IEEE_ || isnan(x) ) return z;
        if(x <= 0.0){
        if(x <= 0.0){
            /* yn(n,0) = -inf or yn(x<0) = NaN */
            /* yn(n,0) = -inf or yn(x<0) = NaN */
#ifndef HUGE_VAL 
#ifndef HUGE_VAL 
#define HUGE_VAL inf
#define HUGE_VAL inf
            double inf = 0.0;
            double inf = 0.0;
 
 
            SET_HIGH_WORD(inf,0x7ff00000);      /* set inf to infinite */
            SET_HIGH_WORD(inf,0x7ff00000);      /* set inf to infinite */
#endif
#endif
            exc.type = DOMAIN;  /* should be SING for IEEE */
            exc.type = DOMAIN;  /* should be SING for IEEE */
            exc.name = "yn";
            exc.name = "yn";
            exc.err = 0;
            exc.err = 0;
            exc.arg1 = n;
            exc.arg1 = n;
            exc.arg2 = x;
            exc.arg2 = x;
            if (_LIB_VERSION == _SVID_)
            if (_LIB_VERSION == _SVID_)
                exc.retval = -HUGE;
                exc.retval = -HUGE;
            else
            else
                exc.retval = -HUGE_VAL;
                exc.retval = -HUGE_VAL;
            if (_LIB_VERSION == _POSIX_)
            if (_LIB_VERSION == _POSIX_)
                errno = EDOM;
                errno = EDOM;
            else if (!matherr(&exc)) {
            else if (!matherr(&exc)) {
                errno = EDOM;
                errno = EDOM;
            }
            }
            if (exc.err != 0)
            if (exc.err != 0)
               errno = exc.err;
               errno = exc.err;
            return exc.retval;
            return exc.retval;
        }
        }
        if(x>X_TLOSS) {
        if(x>X_TLOSS) {
            /* yn(x>X_TLOSS) */
            /* yn(x>X_TLOSS) */
            exc.type = TLOSS;
            exc.type = TLOSS;
            exc.name = "yn";
            exc.name = "yn";
            exc.err = 0;
            exc.err = 0;
            exc.arg1 = n;
            exc.arg1 = n;
            exc.arg2 = x;
            exc.arg2 = x;
            exc.retval = 0.0;
            exc.retval = 0.0;
            if (_LIB_VERSION == _POSIX_)
            if (_LIB_VERSION == _POSIX_)
                errno = ERANGE;
                errno = ERANGE;
            else if (!matherr(&exc)) {
            else if (!matherr(&exc)) {
                errno = ERANGE;
                errno = ERANGE;
            }
            }
            if (exc.err != 0)
            if (exc.err != 0)
               errno = exc.err;
               errno = exc.err;
            return exc.retval;
            return exc.retval;
        } else
        } else
            return z;
            return z;
#endif
#endif
}
}
 
 
#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.