4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
26 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
27 * Use is subject to license terms.
30 #pragma weak __scalbnf = scalbnf
33 #include <float.h> /* FLT_MAX, FLT_MIN */
34 #include <stdlib.h> /* abs */
36 static const float twom25f
= 2.98023223876953125e-8F
;
38 static const float two23f
= 8388608.0F
;
41 * v: a non-zero subnormal |x|; returns [-22, 0]
44 ilogbf_biased(unsigned v
) {
54 return (r
+ ((0xffffaa50 >> v
) & 0x3));
56 #endif /* defined(__x86) */
59 scalbnf(float x
, int n
) {
60 int *px
= (int *) &x
, ix
, k
;
62 ix
= *px
& ~0x80000000;
65 #if defined(FPADD_TRAPS_INCOMPLETE_ON_NAN)
66 return (ix
> 0x7f800000 ? x
* x
: x
);
70 if (ix
== 0 || n
== 0)
75 k
= ((*px
& ~0x80000000) >> 23) - 23;
77 k
= ilogbf_biased(ix
);
78 *px
= (*px
& 0x80000000) | (ix
<< (-k
+ 1));
81 if ((unsigned) abs(n
) >= 131072) /* cast to unsigned for -2^31 */
82 n
>>= 1; /* avoid subsequent integer overflow */
85 return (FLT_MAX
* copysignf(FLT_MAX
, x
));
87 return (FLT_MIN
* copysignf(FLT_MIN
, x
));
89 *px
= (*px
& ~0x7f800000) | (k
<< 23);
93 *px
= (*px
& ~0x7f800000) | (k
<< 23);