github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/math/logb.go (about) 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 5 package 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 14 func 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 34 func 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. 49 func ilogb(x float64) int { 50 x, exp := normalize(x) 51 return int((Float64bits(x)>>shift)&mask) - bias + exp 52 }