// 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; } }