11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* @(#)s_logb.c 5.1 93/09/24 */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ==================================================== 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Developed at SunPro, a Sun Microsystems, Inc. business. 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * software is freely granted, provided that this notice 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is preserved. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ==================================================== 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char rcsid[] = "$FreeBSD: src/lib/msun/src/s_logb.c,v 1.10 2005/12/03 11:57:19 bde Exp $"; 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * double logb(x) 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IEEE 754 logb. Included to pass IEEE test suite. Not recommend. 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Use ilogb instead. 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h" 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h" 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const double 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttwo54 = 1.80143985094819840000e+16; /* 43500000 00000000 */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdouble 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlogb(double x) 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t lx,ix; 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project EXTRACT_WORDS(ix,lx,x); 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ix &= 0x7fffffff; /* high |x| */ 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if((ix|lx)==0) return -1.0/fabs(x); 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix>=0x7ff00000) return x*x; 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<0x00100000) { 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project x *= two54; /* convert subnormal x to normal */ 391fa7b45df8b146a42dc99af9004ce9ea93e7748bJack Ren GET_HIGH_WORD(ix,x); 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ix &= 0x7fffffff; 411fa7b45df8b146a42dc99af9004ce9ea93e7748bJack Ren return (double) ((ix>>20)-1023-54); 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (double) ((ix>>20)-1023); 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 45