source: trunk/libs/newlib/src/newlib/libm/math/wf_gamma.c @ 567

Last change on this file since 567 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.2 KB
Line 
1/* wf_gamma.c -- float version of w_gamma.c.
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 */
4
5/*
6 * ====================================================
7 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8 *
9 * Developed at SunPro, a Sun Microsystems, Inc. business.
10 * Permission to use, copy, modify, and distribute this
11 * software is freely granted, provided that this notice
12 * is preserved.
13 * ====================================================
14 *
15 */
16
17#include "fdlibm.h"
18#include <reent.h>
19#include <errno.h>
20
21#ifdef __STDC__
22        float gammaf(float x)
23#else
24        float gammaf(x)
25        float x;
26#endif
27{
28#ifdef _IEEE_LIBM
29        return __ieee754_gammaf_r(x,&(_REENT_SIGNGAM(_REENT)));
30#else
31        float y;
32        struct exception exc;
33        y = __ieee754_gammaf_r(x,&(_REENT_SIGNGAM(_REENT)));
34        if(_LIB_VERSION == _IEEE_) return y;
35        if(!finitef(y)&&finitef(x)) {
36#ifndef HUGE_VAL
37#define HUGE_VAL inf
38            double inf = 0.0;
39
40            SET_HIGH_WORD(inf,0x7ff00000);      /* set inf to infinite */
41#endif
42            if(floorf(x)==x&&x<=(float)0.0) {
43                /* gammaf(-integer) or gammaf(0) */
44                exc.type = SING;
45                exc.name = "gammaf";
46                exc.err = 0;
47                exc.arg1 = exc.arg2 = (double)x;
48                if (_LIB_VERSION == _SVID_)
49                  exc.retval = HUGE;
50                else
51                  exc.retval = HUGE_VAL;
52                if (_LIB_VERSION == _POSIX_)
53                  errno = EDOM;
54                else if (!matherr(&exc)) {
55                  errno = EDOM;
56                }
57            } else {
58                /* gammaf(finite) overflow */
59                exc.type = OVERFLOW;
60                exc.name = "gammaf";
61                exc.err = 0;
62                exc.arg1 = exc.arg2 = (double)x;
63                if (_LIB_VERSION == _SVID_)
64                  exc.retval = HUGE;
65                else
66                  exc.retval = HUGE_VAL;
67                if (_LIB_VERSION == _POSIX_)
68                  errno = ERANGE;
69                else if (!matherr(&exc)) {
70                  errno = ERANGE;
71                }
72            }
73            if (exc.err != 0)
74               errno = exc.err;
75            return (float)exc.retval; 
76        } else
77            return y;
78#endif
79}             
80
81#ifdef _DOUBLE_IS_32BITS
82
83#ifdef __STDC__
84        double gamma(double x)
85#else
86        double gamma(x)
87        double x;
88#endif
89{
90        return (double) gammaf((float) x);
91}
92
93#endif /* defined(_DOUBLE_IS_32BITS) */
Note: See TracBrowser for help on using the repository browser.