| // 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 |
| |
| import math "math" |
| export pow |
| |
| /* |
| arg1 ^ arg2 (exponentiation) |
| */ |
| |
| func |
| pow(arg1,arg2 float64) float64 |
| { |
| var temp float64; |
| 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(arg2); |
| if temp != arg2 { |
| panic sys.NaN(); |
| } |
| |
| l = long(temp); |
| if l&1 != 0 { |
| return -pow(-arg1, arg2); |
| } |
| return pow(-arg1, arg2); |
| } |
| |
| temp = floor(arg2); |
| if temp != arg2 { |
| if arg2-temp == .5 { |
| if temp == 0 { |
| return sqrt(arg1); |
| } |
| return pow(arg1, temp) * sqrt(arg1); |
| } |
| return exp(arg2 * log(arg1)); |
| } |
| |
| l = long(temp); |
| temp = 1; |
| for { |
| if l&1 != 0 { |
| temp = temp*arg1; |
| } |
| l >>= 1; |
| if l == 0 { |
| return temp; |
| } |
| arg1 *= arg1; |
| } |
| } |