Initial revision
[kopensolaris-gnu/glibc.git] / sysdeps / ieee754 / ldexp.c
1 /* Copyright (C) 1992 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 /*
20  * Copyright (c) 1985 Regents of the University of California.
21  * All rights reserved.
22  *
23  * Redistribution and use in source and binary forms are permitted provided
24  * that: (1) source distributions retain this entire copyright notice and
25  * comment, and (2) distributions including binaries display the following
26  * acknowledgement:  ``This product includes software developed by the
27  * University of California, Berkeley and its contributors'' in the
28  * documentation or other materials provided with the distribution and in
29  * all advertising materials mentioning features or use of this software.
30  * Neither the name of the University nor the names of its contributors may
31  * be used to endorse or promote products derived from this software without
32  * specific prior written permission.
33  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
34  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
35  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
36  */
37
38 #include <ansidecl.h>
39 #include <math.h>
40 #include "ieee754.h"
41
42 double
43 DEFUN(ldexp, (x, exp),
44       double x AND int exp)
45 {
46   union ieee754_double u;
47   u.d = x;
48 #define x u.d
49
50   if (__finite (x))
51     {
52       unsigned int k;
53
54       if (exp < -2100)
55         return 3e-39 * 3e-39;   /* Cause underflow.  */
56       else if (n > 2100)
57         return 1.7e308 + 1.7e308; /* Cause overflow.  */
58
59       if (u.ieee.exponent == 0)
60         return ldexp (x * ldexp (1.0, 54), exp - 54);
61
62       k = u.ieee.exponent + exp;
63       if (k > 0)
64         {
65           if (k < 2047)
66             u.ieee.exponent = k;
67           else
68             return 1.7e308 + 1.7e308; /* Cause overflow.  */
69         }
70       else if (k > -54)
71         {
72           /* Gradual underflow.  */
73           u.ieee.exponent = 1;
74           x *= ldexp (1.0, k - 1);
75         }
76       else
77         return 3e-39 * 3e-39;   /* Cause underflow.  */
78     }
79
80   return x;
81 }