move math out of runtime.
a step toward enforcing package boundaries,
necessary to eliminate global package name space.
R=r
DELTA=581 (310 added, 271 deleted, 0 changed)
OCL=35805
CL=35823
diff --git a/src/pkg/math/bits.go b/src/pkg/math/bits.go
new file mode 100644
index 0000000..00071aa
--- /dev/null
+++ b/src/pkg/math/bits.go
@@ -0,0 +1,105 @@
+// 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
+
+const (
+ uvnan = 0x7FF0000000000001;
+ uvinf = 0x7FF0000000000000;
+ uvneginf = 0xFFF0000000000000;
+ mask = 0x7FF;
+ shift = 64 - 11 - 1;
+ bias = 1022;
+)
+
+// Inf returns positive infinity if sign >= 0, negative infinity if sign < 0.
+func Inf(sign int) float64 {
+ var v uint64;
+ if sign >= 0 {
+ v = uvinf;
+ } else {
+ v = uvneginf;
+ }
+ return Float64frombits(v);
+}
+
+// NaN returns an IEEE 754 ``not-a-number'' value.
+func NaN() float64 {
+ return Float64frombits(uvnan);
+}
+
+// IsNaN returns whether f is an IEEE 754 ``not-a-number'' value.
+func IsNaN(f float64) (is bool) {
+ x := Float64bits(f);
+ return uint32(x>>shift) & mask == mask && x != uvinf && x != uvneginf;
+}
+
+// IsInf returns whether f is an infinity, according to sign.
+// If sign > 0, IsInf returns whether f is positive infinity.
+// If sign < 0, IsInf returns whether f is negative infinity.
+// If sign == 0, IsInf returns whether f is either infinity.
+func IsInf(f float64, sign int) bool {
+ x := Float64bits(f);
+ return sign >= 0 && x == uvinf || sign <= 0 && x == uvneginf;
+}
+
+// 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) {
+ if f == 0 {
+ return;
+ }
+ x := Float64bits(f);
+ exp = int((x>>shift)&mask) - bias;
+ x &^= mask<<shift;
+ x |= bias<<shift;
+ frac = Float64frombits(x);
+ return;
+}
+
+// Ldexp is the inverse of Frexp.
+// It returns frac × 2<sup>exp</sup>.
+func Ldexp(frac float64, exp int) float64 {
+ x := Float64bits(frac);
+ exp += int(x>>shift) & mask;
+ if exp <= 0 {
+ return 0; // underflow
+ }
+ if exp >= mask { // overflow
+ if frac < 0 {
+ return Inf(-1);
+ }
+ return Inf(1);
+ }
+ x &^= mask<<shift;
+ x |= uint64(exp)<<shift;
+ return Float64frombits(x);
+}
+
+// Modf returns integer and fractional floating-point numbers
+// that sum to f.
+// Integer and frac have the same sign as f.
+func Modf(f float64) (int float64, frac float64) {
+ if f < 1 {
+ if f < 0 {
+ int, frac = Modf(-f);
+ return -int, -frac;
+ }
+ return 0, f;
+ }
+
+ x := Float64bits(f);
+ e := uint(x>>shift)&mask - bias;
+
+ // Keep the top 11+e bits, the integer part; clear the rest.
+ if e < 64-11 {
+ x &^= 1<<(64-11-e) - 1;
+ }
+ int = Float64frombits(x);
+ frac = f - int;
+ return;
+}
+