diff options
author | Charles L. Dorian <cldorian@gmail.com> | 2010-02-18 23:33:15 -0800 |
---|---|---|
committer | Charles L. Dorian <cldorian@gmail.com> | 2010-02-18 23:33:15 -0800 |
commit | 6bfe5b2e91e8550eb9bc2ef9727c7a4776bfaa20 (patch) | |
tree | 1bba14290145c34722fe97c24219ade62d79d34f /src/pkg/math/frexp.go | |
parent | fa8f92b53e55905ed2a9936d50612c0bc459aa46 (diff) | |
download | go-6bfe5b2e91e8550eb9bc2ef9727c7a4776bfaa20.tar.gz |
math: add Cbrt and Sincos; x87 versions of Sincos, Frexp, Ldexp
Added special condition and benchmarks for Cbrt, Sincos. Took Frexp and Ldexp out of bits.go.
R=rsc
CC=golang-dev
http://codereview.appspot.com/206084
Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/pkg/math/frexp.go')
-rw-r--r-- | src/pkg/math/frexp.go | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/pkg/math/frexp.go b/src/pkg/math/frexp.go new file mode 100644 index 000000000..8b6d45606 --- /dev/null +++ b/src/pkg/math/frexp.go @@ -0,0 +1,28 @@ +// 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<sup>exp</sup>, +// with the absolute value of frac in the interval [½, 1). +func Frexp(f float64) (frac float64, exp int) { + // TODO(rsc): Remove manual inlining of IsNaN, IsInf + // when compiler does it for us + // special cases + switch { + case f == 0: + return + case f < -MaxFloat64 || f > MaxFloat64 || f != f: // IsInf(f, 0) || IsNaN(f): + frac = f + return + } + x := Float64bits(f) + exp = int((x>>shift)&mask) - bias + x &^= mask << shift + x |= bias << shift + frac = Float64frombits(x) + return +} |