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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [newlib/] [libm/] [math/] [w_pow.c] - Diff between revs 39 and 56

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 39 Rev 56
 
 
 
 
/* @(#)w_pow.c 5.2 93/10/01 */
/* @(#)w_pow.c 5.2 93/10/01 */
/*
/*
 * ====================================================
 * ====================================================
 * 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
        <<pow>>, <<powf>>---x to the power y
        <<pow>>, <<powf>>---x to the power y
INDEX
INDEX
        pow
        pow
INDEX
INDEX
        powf
        powf
 
 
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <math.h>
        #include <math.h>
        double pow(double <[x]>, double <[y]>);
        double pow(double <[x]>, double <[y]>);
        float pow(float <[x]>, float <[y]>);
        float pow(float <[x]>, float <[y]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <math.h>
        #include <math.h>
        double pow(<[x]>, <[y]>);
        double pow(<[x]>, <[y]>);
        double <[x]>, <[y]>;
        double <[x]>, <[y]>;
 
 
        float pow(<[x]>, <[y]>);
        float pow(<[x]>, <[y]>);
        float <[x]>, <[y]>;
        float <[x]>, <[y]>;
 
 
DESCRIPTION
DESCRIPTION
        <<pow>> and <<powf>> calculate <[x]> raised to the exp1.0nt <[y]>.
        <<pow>> and <<powf>> calculate <[x]> raised to the exp1.0nt <[y]>.
        @tex
        @tex
        (That is, $x^y$.)
        (That is, $x^y$.)
        @end tex
        @end tex
 
 
RETURNS
RETURNS
        On success, <<pow>> and <<powf>> return the value calculated.
        On success, <<pow>> and <<powf>> return the value calculated.
 
 
        When the argument values would produce overflow, <<pow>>
        When the argument values would produce overflow, <<pow>>
        returns <<HUGE_VAL>> and set <<errno>> to <<ERANGE>>.  If the
        returns <<HUGE_VAL>> and set <<errno>> to <<ERANGE>>.  If the
        argument <[x]> passed to <<pow>> or <<powf>> is a negative
        argument <[x]> passed to <<pow>> or <<powf>> is a negative
        noninteger, and <[y]> is also not an integer, then <<errno>>
        noninteger, and <[y]> is also not an integer, then <<errno>>
        is set to <<EDOM>>.  If <[x]> and <[y]> are both 0, then
        is set to <<EDOM>>.  If <[x]> and <[y]> are both 0, then
        <<pow>> and <<powf>> return <<1>>.
        <<pow>> and <<powf>> return <<1>>.
 
 
        You can modify error handling for these functions using <<matherr>>.
        You can modify error handling for these functions using <<matherr>>.
 
 
PORTABILITY
PORTABILITY
        <<pow>> is ANSI C. <<powf>> is an extension.  */
        <<pow>> is ANSI C. <<powf>> is an extension.  */
 
 
/*
/*
 * wrapper pow(x,y) return x**y
 * wrapper pow(x,y) return x**y
 */
 */
 
 
#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 pow(double x, double y)  /* wrapper pow */
        double pow(double x, double y)  /* wrapper pow */
#else
#else
        double pow(x,y)                 /* wrapper pow */
        double pow(x,y)                 /* wrapper pow */
        double x,y;
        double x,y;
#endif
#endif
{
{
#ifdef _IEEE_LIBM
#ifdef _IEEE_LIBM
        return  __ieee754_pow(x,y);
        return  __ieee754_pow(x,y);
#else
#else
        double z;
        double z;
#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
        struct exception exc;
        struct exception exc;
        z=__ieee754_pow(x,y);
        z=__ieee754_pow(x,y);
        if(_LIB_VERSION == _IEEE_|| isnan(y)) return z;
        if(_LIB_VERSION == _IEEE_|| isnan(y)) return z;
        if(isnan(x)) {
        if(isnan(x)) {
            if(y==0.0) {
            if(y==0.0) {
                /* pow(NaN,0.0) */
                /* pow(NaN,0.0) */
                /* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */
                /* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */
                exc.type = DOMAIN;
                exc.type = DOMAIN;
                exc.name = "pow";
                exc.name = "pow";
 
                exc.err = 0;
 
                exc.arg1 = x;
 
                exc.arg2 = y;
                exc.retval = x;
                exc.retval = x;
                if (_LIB_VERSION == _IEEE_ ||
                if (_LIB_VERSION == _IEEE_ ||
                    _LIB_VERSION == _POSIX_) exc.retval = 1.0;
                    _LIB_VERSION == _POSIX_) exc.retval = 1.0;
                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;
            } else
            } else
                return z;
                return z;
        }
        }
        if(x==0.0){
        if(x==0.0){
            if(y==0.0) {
            if(y==0.0) {
                /* pow(0.0,0.0) */
                /* pow(0.0,0.0) */
                /* error only if _LIB_VERSION == _SVID_ */
                /* error only if _LIB_VERSION == _SVID_ */
                exc.type = DOMAIN;
                exc.type = DOMAIN;
                exc.name = "pow";
                exc.name = "pow";
 
                exc.err = 0;
 
                exc.arg1 = x;
 
                exc.arg2 = y;
                exc.retval = 0.0;
                exc.retval = 0.0;
                if (_LIB_VERSION != _SVID_) exc.retval = 1.0;
                if (_LIB_VERSION != _SVID_) exc.retval = 1.0;
                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(finite(y)&&y<0.0) {
            if(finite(y)&&y<0.0) {
                /* 0**neg */
                /* 0**neg */
                exc.type = DOMAIN;
                exc.type = DOMAIN;
                exc.name = "pow";
                exc.name = "pow";
 
                exc.err = 0;
 
                exc.arg1 = x;
 
                exc.arg2 = y;
                if (_LIB_VERSION == _SVID_)
                if (_LIB_VERSION == _SVID_)
                  exc.retval = 0.0;
                  exc.retval = 0.0;
                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;
            }
            }
            return z;
            return z;
        }
        }
        if(!finite(z)) {
        if(!finite(z)) {
            if(finite(x)&&finite(y)) {
            if(finite(x)&&finite(y)) {
                if(isnan(z)) {
                if(isnan(z)) {
                    /* neg**non-integral */
                    /* neg**non-integral */
                    exc.type = DOMAIN;
                    exc.type = DOMAIN;
                    exc.name = "pow";
                    exc.name = "pow";
 
                    exc.err = 0;
 
                    exc.arg1 = x;
 
                    exc.arg2 = y;
                    if (_LIB_VERSION == _SVID_)
                    if (_LIB_VERSION == _SVID_)
                        exc.retval = 0.0;
                        exc.retval = 0.0;
                    else
                    else
                        exc.retval = 0.0/0.0;   /* X/Open allow NaN */
                        exc.retval = 0.0/0.0;   /* X/Open allow NaN */
                    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;
                } else {
                } else {
                    /* pow(x,y) overflow */
                    /* pow(x,y) overflow */
                    exc.type = OVERFLOW;
                    exc.type = OVERFLOW;
                    exc.name = "pow";
                    exc.name = "pow";
 
                    exc.err = 0;
 
                    exc.arg1 = x;
 
                    exc.arg2 = y;
                    if (_LIB_VERSION == _SVID_) {
                    if (_LIB_VERSION == _SVID_) {
                       exc.retval = HUGE;
                       exc.retval = HUGE;
                       y *= 0.5;
                       y *= 0.5;
                       if(x<0.0&&rint(y)!=y) exc.retval = -HUGE;
                       if(x<0.0&&rint(y)!=y) exc.retval = -HUGE;
                    } else {
                    } else {
                       exc.retval = HUGE_VAL;
                       exc.retval = HUGE_VAL;
                       y *= 0.5;
                       y *= 0.5;
                       if(x<0.0&&rint(y)!=y) exc.retval = -HUGE_VAL;
                       if(x<0.0&&rint(y)!=y) exc.retval = -HUGE_VAL;
                    }
                    }
                    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;
                }
                }
            }
            }
        }
        }
        if(z==0.0&&finite(x)&&finite(y)) {
        if(z==0.0&&finite(x)&&finite(y)) {
            /* pow(x,y) underflow */
            /* pow(x,y) underflow */
            exc.type = UNDERFLOW;
            exc.type = UNDERFLOW;
            exc.name = "pow";
            exc.name = "pow";
 
            exc.err = 0;
 
            exc.arg1 = x;
 
            exc.arg2 = y;
            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;
        }
        }
        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.