summaryrefslogtreecommitdiff
path: root/src/lib/math/pow.go
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2008-03-28 13:56:47 -0700
committerKen Thompson <ken@golang.org>2008-03-28 13:56:47 -0700
commit1463bef67c5aefa2f5e6adcaef2a2a8161b27fa3 (patch)
treeaffa4befc2ba7f7e5b637b1785e46f52550da885 /src/lib/math/pow.go
parenteefc165c0b299d4c8206809f0c771eaccef8dc50 (diff)
downloadgolang-1463bef67c5aefa2f5e6adcaef2a2a8161b27fa3.tar.gz
SVN=114204
Diffstat (limited to 'src/lib/math/pow.go')
-rw-r--r--src/lib/math/pow.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/lib/math/pow.go b/src/lib/math/pow.go
new file mode 100644
index 000000000..b2a954fb1
--- /dev/null
+++ b/src/lib/math/pow.go
@@ -0,0 +1,70 @@
+// 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 pow
+
+import sys "sys"
+import floor "floor"
+import sqrt "sqrt"
+import log "log"
+import exp "exp"
+export pow
+
+/*
+ arg1 ^ arg2 (exponentiation)
+ */
+
+func
+pow(arg1,arg2 double) double
+{
+ var temp double;
+ var l long;
+
+ if arg2 < 0 {
+ return 1/pow(arg1, -arg2);
+ }
+ if arg1 <= 0 {
+ if(arg1 == 0) {
+ if arg2 <= 0 {
+ return sys.NaN();
+ }
+ return 0;
+ }
+
+ temp = floor.floor(arg2);
+ if temp != arg2 {
+ return sys.NaN();
+ }
+
+ l = long(temp);
+ if l&1 != 0 {
+ return -pow(-arg1, arg2);
+ }
+ return pow(-arg1, arg2);
+ }
+
+ temp = floor.floor(arg2);
+ if temp != arg2 {
+ if arg2-temp == .5 {
+ if temp == 0 {
+ return sqrt.sqrt(arg1);
+ }
+ return pow(arg1, temp) * sqrt.sqrt(arg1);
+ }
+ return exp.exp(arg2 * log.log(arg1));
+ }
+
+ l = long(temp);
+ temp = 1;
+ for {
+ if l&1 != 0 {
+ temp = temp*arg1;
+ }
+ l = l>>1;
+ if l == 0 {
+ return temp;
+ }
+ arg1 = arg1*arg1;
+ }
+}