| // 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 |
| } |