11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* @(#)s_ilogb.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_ilogb.c,v 1.9 2004/10/09 17:14:28 stefanf Exp $"; 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* ilogb(double x) 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return the binary exponent of non-zero x 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ilogb(0) = FP_ILOGB0 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ilogb(NaN) = FP_ILOGBNAN (no signal is raised) 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ilogb(inf) = INT_MAX (no signal is raised) 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <limits.h> 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h" 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h" 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ilogb(double x) 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t hx,lx,ix; 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project EXTRACT_WORDS(hx,lx,x); 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hx &= 0x7fffffff; 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(hx<0x00100000) { 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if((hx|lx)==0) 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return FP_ILOGB0; 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else /* subnormal x */ 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(hx==0) { 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (ix = -1043; lx>0; lx<<=1) ix -=1; 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1; 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ix; 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (hx<0x7ff00000) return (hx>>20)-1023; 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (hx>0x7ff00000 || lx!=0) return FP_ILOGBNAN; 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else return INT_MAX; 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 50