github.com/peggyl/go@v0.0.0-20151008231540-ae315999c2d5/src/math/frexp.go (about) 1 // Copyright 2009 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 // Frexp breaks f into a normalized fraction 8 // and an integral power of two. 9 // It returns frac and exp satisfying f == frac × 2**exp, 10 // with the absolute value of frac in the interval [½, 1). 11 // 12 // Special cases are: 13 // Frexp(±0) = ±0, 0 14 // Frexp(±Inf) = ±Inf, 0 15 // Frexp(NaN) = NaN, 0 16 func Frexp(f float64) (frac float64, exp int) 17 18 func frexp(f float64) (frac float64, exp int) { 19 // special cases 20 switch { 21 case f == 0: 22 return f, 0 // correctly return -0 23 case IsInf(f, 0) || IsNaN(f): 24 return f, 0 25 } 26 f, exp = normalize(f) 27 x := Float64bits(f) 28 exp += int((x>>shift)&mask) - bias + 1 29 x &^= mask << shift 30 x |= (-1 + bias) << shift 31 frac = Float64frombits(x) 32 return 33 }