1// Copyright 2010 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package math 6 7// Logb returns the binary exponent of x. 8// 9// Special cases are: 10// 11// Logb(±Inf) = +Inf 12// Logb(0) = -Inf 13// Logb(NaN) = NaN 14func Logb(x float64) float64 { 15 // special cases 16 switch { 17 case x == 0: 18 return Inf(-1) 19 case IsInf(x, 0): 20 return Inf(1) 21 case IsNaN(x): 22 return x 23 } 24 return float64(ilogb(x)) 25} 26 27// Ilogb returns the binary exponent of x as an integer. 28// 29// Special cases are: 30// 31// Ilogb(±Inf) = MaxInt32 32// Ilogb(0) = MinInt32 33// Ilogb(NaN) = MaxInt32 34func Ilogb(x float64) int { 35 // special cases 36 switch { 37 case x == 0: 38 return MinInt32 39 case IsNaN(x): 40 return MaxInt32 41 case IsInf(x, 0): 42 return MaxInt32 43 } 44 return ilogb(x) 45} 46 47// ilogb returns the binary exponent of x. It assumes x is finite and 48// non-zero. 49func ilogb(x float64) int { 50 x, exp := normalize(x) 51 return int((Float64bits(x)>>shift)&mask) - bias + exp 52} 53