diff options
author | Russ Cox <rsc@golang.org> | 2009-01-22 16:23:44 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-01-22 16:23:44 -0800 |
commit | 29760f278cf9110e9e165af3f8aa53a89ff94f86 (patch) | |
tree | ece2442553c8681e8134d2201e6201e1e429adb8 /src/lib/math | |
parent | ca01b9bdc8fc325f98c57b1949942edfc00867f7 (diff) | |
download | golang-29760f278cf9110e9e165af3f8aa53a89ff94f86.tar.gz |
move math routines from package sys to package math,
though they still build in src/runtime.
use cgo instead of hand-written wrappers.
R=r
DELTA=740 (289 added, 300 deleted, 151 changed)
OCL=23326
CL=23331
Diffstat (limited to 'src/lib/math')
-rw-r--r-- | src/lib/math/Makefile | 26 | ||||
-rw-r--r-- | src/lib/math/asin.go | 4 | ||||
-rw-r--r-- | src/lib/math/exp.go | 10 | ||||
-rw-r--r-- | src/lib/math/floor.go | 6 | ||||
-rw-r--r-- | src/lib/math/fmod.go | 8 | ||||
-rw-r--r-- | src/lib/math/log.go | 10 | ||||
-rw-r--r-- | src/lib/math/pow.go | 10 | ||||
-rw-r--r-- | src/lib/math/sin.go | 4 | ||||
-rw-r--r-- | src/lib/math/sqrt.go | 8 | ||||
-rw-r--r-- | src/lib/math/tan.go | 4 |
10 files changed, 52 insertions, 38 deletions
diff --git a/src/lib/math/Makefile b/src/lib/math/Makefile index d0debdbbc..623626e96 100644 --- a/src/lib/math/Makefile +++ b/src/lib/math/Makefile @@ -32,48 +32,56 @@ coverage: packages $(AS) $*.s O1=\ - exp.$O\ fabs.$O\ - floor.$O\ - fmod.$O\ hypot.$O\ pow10.$O\ - sqrt.$O\ + runtime.$O\ const.$O\ O2=\ atan.$O\ + exp.$O\ + floor.$O\ + fmod.$O\ log.$O\ sin.$O\ - sinh.$O\ + sqrt.$O\ tan.$O\ O3=\ asin.$O\ atan2.$O\ pow.$O\ + sinh.$O\ + +O4=\ tanh.$O\ -math.a: a1 a2 a3 +math.a: a1 a2 a3 a4 a1: $(O1) - $(AR) grc math.a exp.$O fabs.$O floor.$O fmod.$O hypot.$O pow10.$O sqrt.$O const.$O + $(AR) grc math.a fabs.$O hypot.$O pow10.$O runtime.$O const.$O rm -f $(O1) a2: $(O2) - $(AR) grc math.a atan.$O log.$O sin.$O sinh.$O tan.$O + $(AR) grc math.a atan.$O exp.$O floor.$O fmod.$O log.$O sin.$O sqrt.$O tan.$O rm -f $(O2) a3: $(O3) - $(AR) grc math.a asin.$O atan2.$O pow.$O tanh.$O + $(AR) grc math.a asin.$O atan2.$O pow.$O sinh.$O rm -f $(O3) +a4: $(O4) + $(AR) grc math.a tanh.$O + rm -f $(O4) + newpkg: clean $(AR) grc math.a $(O1): newpkg $(O2): a1 $(O3): a2 +$(O4): a3 nuke: clean rm -f $(GOROOT)/pkg/math.a diff --git a/src/lib/math/asin.go b/src/lib/math/asin.go index d39339ea1..cd3a0b7a0 100644 --- a/src/lib/math/asin.go +++ b/src/lib/math/asin.go @@ -24,7 +24,7 @@ func Asin(arg float64) float64 { sign = true; } if arg > 1 { - return sys.NaN(); + return NaN(); } temp = Sqrt(1 - x*x); @@ -42,7 +42,7 @@ func Asin(arg float64) float64 { func Acos(arg float64) float64 { if arg > 1 || arg < -1 { - return sys.NaN(); + return NaN(); } return Pi/2 - Asin(arg); } diff --git a/src/lib/math/exp.go b/src/lib/math/exp.go index 0d06ff9cb..d781c1dec 100644 --- a/src/lib/math/exp.go +++ b/src/lib/math/exp.go @@ -101,12 +101,12 @@ func Exp(x float64) float64 { // special cases switch { - case sys.IsNaN(x) || sys.IsInf(x, 1): + case IsNaN(x) || IsInf(x, 1): return x; - case sys.IsInf(x, -1): + case IsInf(x, -1): return 0; case x > Overflow: - return sys.Inf(1); + return Inf(1); case x < Underflow: return 0; case -NearZero < x && x < NearZero: @@ -129,6 +129,6 @@ func Exp(x float64) float64 { t := r * r; c := r - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); y := 1 - ((lo - (r*c)/(2-c)) - hi); - // TODO(rsc): make sure sys.Ldexp can handle boundary k - return sys.Ldexp(y, k); + // TODO(rsc): make sure Ldexp can handle boundary k + return Ldexp(y, k); } diff --git a/src/lib/math/floor.go b/src/lib/math/floor.go index 1cbdded47..cedecd1f6 100644 --- a/src/lib/math/floor.go +++ b/src/lib/math/floor.go @@ -4,6 +4,8 @@ package math +import "math" + /* * floor and ceil-- greatest integer <= arg * (resp least >=) @@ -11,13 +13,13 @@ package math func Floor(arg float64) float64 { if arg < 0 { - d, fract := sys.Modf(-arg); + d, fract := Modf(-arg); if fract != 0.0 { d = d+1; } return -d; } - d, fract := sys.Modf(arg); + d, fract := Modf(arg); return d; } diff --git a/src/lib/math/fmod.go b/src/lib/math/fmod.go index f30ae3563..75e5eece2 100644 --- a/src/lib/math/fmod.go +++ b/src/lib/math/fmod.go @@ -4,6 +4,8 @@ package math +import "math" + /* * floating-point mod func without infinity or NaN checking */ @@ -16,7 +18,7 @@ func Fmod(x, y float64) float64 { y = -y; } - yfr, yexp := sys.Frexp(y); + yfr, yexp := Frexp(y); sign := false; r := x; if x < 0 { @@ -25,11 +27,11 @@ func Fmod(x, y float64) float64 { } for r >= y { - rfr, rexp := sys.Frexp(r); + rfr, rexp := Frexp(r); if rfr < yfr { rexp = rexp - 1; } - r = r - sys.Ldexp(y, rexp-yexp); + r = r - Ldexp(y, rexp-yexp); } if sign { r = -r; diff --git a/src/lib/math/log.go b/src/lib/math/log.go index 76b5231e5..887421642 100644 --- a/src/lib/math/log.go +++ b/src/lib/math/log.go @@ -85,16 +85,16 @@ func Log(x float64) float64 { // special cases switch { - case sys.IsNaN(x) || sys.IsInf(x, 1): + case IsNaN(x) || IsInf(x, 1): return x; case x < 0: - return sys.NaN(); + return NaN(); case x == 0: - return sys.Inf(-1); + return Inf(-1); } // reduce - f1, ki := sys.Frexp(x); + f1, ki := Frexp(x); if f1 < Sqrt2/2 { f1 *= 2; ki--; @@ -115,7 +115,7 @@ func Log(x float64) float64 { func Log10(arg float64) float64 { if arg <= 0 { - return sys.NaN(); + return NaN(); } return Log(arg) * (1/Ln10); } diff --git a/src/lib/math/pow.go b/src/lib/math/pow.go index 3ab218d5e..929943a13 100644 --- a/src/lib/math/pow.go +++ b/src/lib/math/pow.go @@ -17,7 +17,7 @@ func Pow(x, y float64) float64 { case x == 0 && y > 0: return 0; case x == 0 && y < 0: - return sys.Inf(1); + return Inf(1); case y == 0.5: return Sqrt(x); case y == -0.5: @@ -30,9 +30,9 @@ func Pow(x, y float64) float64 { absy = -absy; flip = true; } - yi, yf := sys.Modf(absy); + yi, yf := Modf(absy); if yf != 0 && x < 0 { - return sys.NaN(); + return NaN(); } if yi >= 1<<63 { return Exp(y * Log(x)); @@ -55,7 +55,7 @@ func Pow(x, y float64) float64 { // by multiplying in successive squarings // of x according to bits of yi. // accumulate powers of two into exp. - x1, xe := sys.Frexp(x); + x1, xe := Frexp(x); for i := int64(yi); i != 0; i >>= 1 { if i&1 == 1 { a1 *= x1; @@ -76,5 +76,5 @@ func Pow(x, y float64) float64 { a1 = 1 / a1; ae = -ae; } - return sys.Ldexp(a1, ae); + return Ldexp(a1, ae); } diff --git a/src/lib/math/sin.go b/src/lib/math/sin.go index fc8a05d4b..9c7b39bf8 100644 --- a/src/lib/math/sin.go +++ b/src/lib/math/sin.go @@ -29,9 +29,9 @@ func sinus(arg float64, quad int) float64 { var y float64; if x > 32764 { var e float64; - e, y = sys.Modf(x); + e, y = Modf(x); e = e + float64(quad); - temp1, f := sys.Modf(0.25*e); + temp1, f := Modf(0.25*e); quad = int(e - 4*f); } else { k := int32(x); diff --git a/src/lib/math/sqrt.go b/src/lib/math/sqrt.go index cf256b25c..466b92771 100644 --- a/src/lib/math/sqrt.go +++ b/src/lib/math/sqrt.go @@ -4,6 +4,8 @@ package math +import "math" + /* * sqrt returns the square root of its floating * point argument. Newton's method. @@ -12,18 +14,18 @@ package math */ func Sqrt(arg float64) float64 { - if sys.IsInf(arg, 1) { + if IsInf(arg, 1) { return arg; } if arg <= 0 { if arg < 0 { - return sys.NaN(); + return NaN(); } return 0; } - x,exp := sys.Frexp(arg); + x,exp := Frexp(arg); for x < 0.5 { x = x*2; exp = exp-1; diff --git a/src/lib/math/tan.go b/src/lib/math/tan.go index 4910fa3a4..99155d005 100644 --- a/src/lib/math/tan.go +++ b/src/lib/math/tan.go @@ -33,7 +33,7 @@ func Tan(arg float64) float64 { } x = x * (4/Pi); /* overflow? */ var e float64; - e, x = sys.Modf(x); + e, x = Modf(x); i := int32(e); switch i & 3 { @@ -56,7 +56,7 @@ func Tan(arg float64) float64 { if flag { if(temp == 0) { - panic(sys.NaN()); + panic(NaN()); } temp = 1/temp; } |