78 lines
1.3 KiB
Go
78 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
func expI(b, p int) (int, error) {
|
|
if p < 0 {
|
|
return 0, errors.New("negative power not allowed")
|
|
}
|
|
r := 1
|
|
for i := 1; i <= p; i++ {
|
|
r *= b
|
|
}
|
|
return r, nil
|
|
}
|
|
|
|
func expF(b float32, p int) float32 {
|
|
var neg bool
|
|
if p < 0 {
|
|
neg = true
|
|
p = -p
|
|
}
|
|
r := float32(1)
|
|
for pow := b; p > 0; pow *= pow {
|
|
if p&1 == 1 {
|
|
r *= pow
|
|
}
|
|
p >>= 1
|
|
}
|
|
if neg {
|
|
r = 1 / r
|
|
}
|
|
return r
|
|
}
|
|
|
|
func main() {
|
|
ti := func(b, p int) {
|
|
fmt.Printf("%d^%d: ", b, p)
|
|
e, err := expI(b, p)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
} else {
|
|
fmt.Println(e)
|
|
}
|
|
}
|
|
|
|
fmt.Println("expI tests")
|
|
ti(2, 10)
|
|
ti(2, -10)
|
|
ti(-2, 10)
|
|
ti(-2, 11)
|
|
ti(11, 0)
|
|
|
|
fmt.Println("overflow undetected")
|
|
ti(10, 10)
|
|
|
|
tf := func(b float32, p int) {
|
|
fmt.Printf("%g^%d: %g\n", b, p, expF(b, p))
|
|
}
|
|
|
|
fmt.Println("\nexpF tests:")
|
|
tf(2, 10)
|
|
tf(2, -10)
|
|
tf(-2, 10)
|
|
tf(-2, 11)
|
|
tf(11, 0)
|
|
|
|
fmt.Println("disallowed in expI, allowed here")
|
|
tf(0, -1)
|
|
|
|
fmt.Println("other interesting cases for 32 bit float type")
|
|
tf(10, 39)
|
|
tf(10, -39)
|
|
tf(-10, 39)
|
|
}
|