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