freebsd-skq/lib/msun/src/s_logb.c
Bruce Evans aa7c7c47cf Oops, fix the fix in rev.1.10. logb() and logbf() were broken on
denormals, and logb() remained broken after 1.10 because the fix for
logbf() was incompletely translated.

Convert to __FBSDID().
2008-02-08 01:22:13 +00:00

50 lines
1.1 KiB
C

/* @(#)s_logb.c 5.1 93/09/24 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
/*
* double logb(x)
* IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
* Use ilogb instead.
*/
#include <float.h>
#include "math.h"
#include "math_private.h"
static const double
two54 = 1.80143985094819840000e+16; /* 43500000 00000000 */
double
logb(double x)
{
int32_t lx,ix;
EXTRACT_WORDS(ix,lx,x);
ix &= 0x7fffffff; /* high |x| */
if((ix|lx)==0) return -1.0/fabs(x);
if(ix>=0x7ff00000) return x*x;
if(ix<0x00100000) {
x *= two54; /* convert subnormal x to normal */
GET_HIGH_WORD(ix,x);
ix &= 0x7fffffff;
return (double) ((ix>>20)-1023-54);
} else
return (double) ((ix>>20)-1023);
}
#if (LDBL_MANT_DIG == 53)
__weak_reference(logb, logbl);
#endif