// PowInt
/*
------------------------------------------------------
作者   : Black Ghost
日期   : 2018-12-12
版本   : 0.0.0
------------------------------------------------------
    计算整数或浮点数的整数次幂
理论：

------------------------------------------------------
输入   :
    a, n    a^n
输出   :
    sol     解
------------------------------------------------------
*/

package goNum

import (
	"math"
)

// PowFInt 浮点数的整数次幂
func PowFInt(a float64, n int) float64 {
	/*
	   计算浮点数的整数次幂
	   输入   :
	       a, n    a^n
	   输出   :
	       sol     解
	*/
	if n < 0 {
		panic("Error in goNum.PowFInt: n less than zero")
	} else if n == 0 {
		return 1.0
	} else if n == 1 {
		return a
	}
	sol := a
	for i := 2; i < n+1; i++ {
		sol = sol * a
	}
	return sol
}

// PowIF 整数的浮点数次幂
func PowIF(a int, n float64) float64 {
	/*
	   计算整数的浮点数次幂
	   输入   :
	       a, n    a^n
	   输出   :
	       sol     解
	*/
	return math.Pow(float64(a), n)
}

// PowIInt 整数的整数次幂，输出整数
func PowIInt(a, n int) int {
	/*
	   计算整数的整数次幂，输出整数
	   输入   :
	       a, n    a^n
	   输出   :
	       sol     解
	*/
	if n < 0 {
		panic("Error in goNum.PowIInt: n less than zero")
	} else if n == 0 {
		return 1
	} else if n == 1 {
		return a
	}
	sol := a
	for i := 2; i < n+1; i++ {
		sol = sol * a
	}
	return sol
}

// PowIIntF 整数的整数次幂，输出浮点
func PowIIntF(a, n int) float64 {
	/*
	   计算整数的整数次幂，输出浮点
	   输入   :
	       a, n    a^n
	   输出   :
	       sol     解
	*/
	if n < 0 {
		panic("Error in goNum.PowIInt: n less than zero")
	} else if n == 0 {
		return 1.0
	} else if n == 1 {
		return float64(a)
	}
	sol := a
	for i := 2; i < n+1; i++ {
		sol = sol * a
	}
	return float64(sol)
}
