github.com/AESNooper/go/src@v0.0.0-20220218095104-b56a4ab1bbbb/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 if haveArchFrexp { 18 return archFrexp(f) 19 } 20 return frexp(f) 21 } 22 23 func frexp(f float64) (frac float64, exp int) { 24 // special cases 25 switch { 26 case f == 0: 27 return f, 0 // correctly return -0 28 case IsInf(f, 0) || IsNaN(f): 29 return f, 0 30 } 31 f, exp = normalize(f) 32 x := Float64bits(f) 33 exp += int((x>>shift)&mask) - bias + 1 34 x &^= mask << shift 35 x |= (-1 + bias) << shift 36 frac = Float64frombits(x) 37 return 38 }