1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13: #if defined(LIBM_SCCS) && !defined(lint)
14: static char rcsid[] = "$NetBSD: e_scalb.c,v 1.6 1995/05/10 20:46:09 jtc Exp $";
15: #endif
16:
17:
18:
19:
20:
21:
22:
23: #include <fenv.h>
24: #include <math.h>
25: #include "math_private.h"
26:
27: #ifdef _SCALB_INT
28: #ifdef __STDC__
29: double __ieee754_scalb(double x, int fn)
30: #else
31: double __ieee754_scalb(x,fn)
32: double x; int fn;
33: #endif
34: #else
35: #ifdef __STDC__
36: double __ieee754_scalb(double x, double fn)
37: #else
38: double __ieee754_scalb(x,fn)
39: double x, fn;
40: #endif
41: #endif
42: {
43: #ifdef _SCALB_INT
44: return __scalbn(x,fn);
45: #else
46: if (__isnan(x)||__isnan(fn)) return x*fn;
47: if (!__finite(fn)) {
48: if(fn>0.0) return x*fn;
49: else if (x == 0)
50: return x;
51: else if (!__finite (x))
52: {
53: # ifdef FE_INVALID
54: feraiseexcept (FE_INVALID);
55: # endif
56: return __nan ("");
57: }
58: else return x/(-fn);
59: }
60: if (__rint(fn)!=fn)
61: {
62: # ifdef FE_INVALID
63: feraiseexcept (FE_INVALID);
64: # endif
65: return __nan ("");
66: }
67: if ( fn > 65000.0) return __scalbn(x, 65000);
68: if (-fn > 65000.0) return __scalbn(x,-65000);
69: return __scalbn(x,(int)fn);
70: #endif
71: }