// Copyright 2010 The Go Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
package math | |
// Logb returns the binary exponent of x. | |
// | |
// Special cases are: | |
// Logb(±Inf) = +Inf | |
// Logb(0) = -Inf | |
// Logb(NaN) = NaN | |
func Logb(x float64) float64 { | |
// special cases | |
switch { | |
case x == 0: | |
return Inf(-1) | |
case IsInf(x, 0): | |
return Inf(1) | |
case IsNaN(x): | |
return x | |
} | |
return float64(ilogb(x)) | |
} | |
// Ilogb returns the binary exponent of x as an integer. | |
// | |
// Special cases are: | |
// Ilogb(±Inf) = MaxInt32 | |
// Ilogb(0) = MinInt32 | |
// Ilogb(NaN) = MaxInt32 | |
func Ilogb(x float64) int { | |
// special cases | |
switch { | |
case x == 0: | |
return MinInt32 | |
case IsNaN(x): | |
return MaxInt32 | |
case IsInf(x, 0): | |
return MaxInt32 | |
} | |
return ilogb(x) | |
} | |
// logb returns the binary exponent of x. It assumes x is finite and | |
// non-zero. | |
func ilogb(x float64) int { | |
x, exp := normalize(x) | |
return int((Float64bits(x)>>shift)&mask) - bias + exp | |
} |