source: trunk/libs/newlib/src/newlib/libm/math/w_lgamma.c @ 444

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

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

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