|  | // Copyright 2009 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 | 
|  |  | 
|  | // Frexp breaks f into a normalized fraction | 
|  | // and an integral power of two. | 
|  | // It returns frac and exp satisfying f == frac × 2**exp, | 
|  | // with the absolute value of frac in the interval [½, 1). | 
|  | // | 
|  | // Special cases are: | 
|  | //	Frexp(±0) = ±0, 0 | 
|  | //	Frexp(±Inf) = ±Inf, 0 | 
|  | //	Frexp(NaN) = NaN, 0 | 
|  | func Frexp(f float64) (frac float64, exp int) { | 
|  | return frexp(f) | 
|  | } | 
|  |  | 
|  | func frexp(f float64) (frac float64, exp int) { | 
|  | // special cases | 
|  | switch { | 
|  | case f == 0: | 
|  | return f, 0 // correctly return -0 | 
|  | case IsInf(f, 0) || IsNaN(f): | 
|  | return f, 0 | 
|  | } | 
|  | f, exp = normalize(f) | 
|  | x := Float64bits(f) | 
|  | exp += int((x>>shift)&mask) - bias + 1 | 
|  | x &^= mask << shift | 
|  | x |= (-1 + bias) << shift | 
|  | frac = Float64frombits(x) | 
|  | return | 
|  | } |