1 |
/* $MidnightBSD$ */ |
2 |
|
3 |
/* @(#)e_scalb.c 1.3 95/01/18 */ |
4 |
/* |
5 |
* ==================================================== |
6 |
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
7 |
* |
8 |
* Developed at SunSoft, a Sun Microsystems, Inc. business. |
9 |
* Permission to use, copy, modify, and distribute this |
10 |
* software is freely granted, provided that this notice |
11 |
* is preserved. |
12 |
* ==================================================== |
13 |
*/ |
14 |
|
15 |
#include <sys/cdefs.h> |
16 |
__FBSDID("$FreeBSD: stable/10/lib/msun/src/e_scalb.c 176451 2008-02-22 02:30:36Z das $"); |
17 |
|
18 |
/* |
19 |
* __ieee754_scalb(x, fn) is provide for |
20 |
* passing various standard test suite. One |
21 |
* should use scalbn() instead. |
22 |
*/ |
23 |
|
24 |
#include "math.h" |
25 |
#include "math_private.h" |
26 |
|
27 |
#ifdef _SCALB_INT |
28 |
double |
29 |
__ieee754_scalb(double x, int fn) |
30 |
#else |
31 |
double |
32 |
__ieee754_scalb(double x, double fn) |
33 |
#endif |
34 |
{ |
35 |
#ifdef _SCALB_INT |
36 |
return scalbn(x,fn); |
37 |
#else |
38 |
if (isnan(x)||isnan(fn)) return x*fn; |
39 |
if (!finite(fn)) { |
40 |
if(fn>0.0) return x*fn; |
41 |
else return x/(-fn); |
42 |
} |
43 |
if (rint(fn)!=fn) return (fn-fn)/(fn-fn); |
44 |
if ( fn > 65000.0) return scalbn(x, 65000); |
45 |
if (-fn > 65000.0) return scalbn(x,-65000); |
46 |
return scalbn(x,(int)fn); |
47 |
#endif |
48 |
} |