Home | History | Annotate | Download | only in math
      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 }
     34