diff options
author | Ken Thompson <ken@golang.org> | 2008-03-28 13:56:47 -0700 |
---|---|---|
committer | Ken Thompson <ken@golang.org> | 2008-03-28 13:56:47 -0700 |
commit | 1463bef67c5aefa2f5e6adcaef2a2a8161b27fa3 (patch) | |
tree | affa4befc2ba7f7e5b637b1785e46f52550da885 /src/lib/math/pow.go | |
parent | eefc165c0b299d4c8206809f0c771eaccef8dc50 (diff) | |
download | golang-1463bef67c5aefa2f5e6adcaef2a2a8161b27fa3.tar.gz |
SVN=114204
Diffstat (limited to 'src/lib/math/pow.go')
-rw-r--r-- | src/lib/math/pow.go | 70 |
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; + } +} |