math包包含一些常量和一些有用的数学计算函数,例如:三角函数、随机数、绝对值、平方等
一 常量fmt.Printf("Float64的最大值: %.f\n", math.MaxFloat64)
fmt.Printf("Float64最小值: %.f\n", math.SmallestNonzeroFloat64)
fmt.Printf("Float32最大值: %.f\n", math.MaxFloat32)
fmt.Printf("Float32最小值: %.f\n", math.SmallestNonzeroFloat32)
fmt.Printf("Int8最大值: %d\n", math.MaxInt8)
fmt.Printf("Int8最小值: %d\n", math.MinInt8)
fmt.Printf("Uint8最大值: %d\n", math.MaxUint8)
fmt.Printf("Int16最大值: %d\n", math.MaxInt16)
fmt.Printf("Int16最小值: %d\n", math.MinInt16)
fmt.Printf("Uint16最大值: %d\n", math.MaxUint16)
fmt.Printf("Int32最大值: %d\n", math.MaxInt32)
fmt.Printf("Int32最小值: %d\n", math.MinInt32)
fmt.Printf("Uint32最大值: %d\n", math.MaxUint32)
fmt.Printf("Int64最大值: %d\n", math.MaxInt64)
fmt.Printf("Int64最小值: %d\n", math.MinInt64)
fmt.Printf("圆周率默认值: %v\n", math.Pi)
常量如下:
Float64的最大值: 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
Float64最小值: 0
Float32最大值: 340282346638528859811704183484516925440
Float32最小值: 0
Int8最大值: 127
Int8最小值: -128
Uint8最大值: 255
Int16最大值: 32767
Int16最小值: -32768
Uint16最大值: 65535
Int32最大值: 2147483647
Int32最小值: -2147483648
Uint32最大值: 4294967295
Int64最大值: 9223372036854775807
Int64最小值: -9223372036854775808
圆周率默认值: 3.141592653589793
二 常用函数
2.1 IsNaN函数
func IsNaN(f float64) (is bool)
报告f是否表示一个NaN(Not A Number)值,是数值返回一个false,不是数值则返回一个true。
func testIsNaN() {
fmt.Println(math.IsNaN(12321.321321)) //false
}
2.2 Ceil函数
func Ceil(x float64) float64
返回一个不小于x的最小整数,简单来说就是向上取整
func testCeil() {
fmt.Println(math.Ceil(1.13456)) //2
}
2.3 Floor函数
func Floor(x float64) float64
返回一个不大于x的最小整数,简单来说就是向下取整
func testFloor() {
fmt.Println(math.Floor(2.9999)) //2
}
2.4 Trunc函数
func Trunc(x float64) float64
返回x整数部分,与Floor一样
func testTrunc() {
fmt.Println(math.Trunc(2.9999)) //2
}
2.5 Abs函数
func Abs(x float64) float64
返回x的绝对值
func testAbs() {
fmt.Println(math.Abs(2.999312323132141665374)) //2.9993123231321417
fmt.Println(math.Abs(2.999312323132141465374)) //2.9993123231321412
}
2.6 Max函数
func Max(x, y float64) float64
返回x和y中最大值
func testMax() {
fmt.Println(math.Max(1000,200)) //1000
}
2.7 Min函数
func Min(x, y float64) float64
返回x和y中最小值
func testMin() {
fmt.Println(math.Min(1000,200)) //200
}
2.8 Dim函数
func Dim(x, y float64) float64
函数返回x-y和0中的最大值
func testDim() {
fmt.Println(math.Dim(1000,2000)) //0
fmt.Println(math.Dim(1000,200)) //800
}
2.9 Mod函数
func Mod(x, y float64) float64
取余运算,可以理解为 x-Trunc(x/y)*y,结果的正负号和x相同
func testMod() {
fmt.Println(math.Mod(123,0)) //NaN
fmt.Println(math.Mod(123,10)) //3
}
2.10 Sqrt函数
func Sqrt(x float64) float64
返回x的二次方根,平方根
func testSqrt() {
fmt.Println(math.Sqrt(144)) //12
}
2.11 Cbrt函数
func Cbrt(x float64) float64
返回x的二次方根,平方根
func testCbrt() {
fmt.Println(math.Cbrt(1728)) //12
}
2.12 Hypot函数
func Hypot(p, q float64) float64
返回Sqrt(p * p + q * q),注意要避免不必要的溢出或下溢。
func testHypot() {
fmt.Println(math.Hypot(12,12)) //16.970562748477143
}
2.13 Pow函数
func Pow(x, y float64) float64
求幂,x的y次方
func testPow() {
fmt.Println(math.Pow(2,3)) //8
}
2.14 Sin函数
func Sin(x float64) float64
求正弦
func testSin() {
fmt.Println(math.Sin(12)) //-0.5365729180004349
}
2.15 Cos函数
func Cos(x float64) float64
求余弦
func testCos() {
fmt.Println(math.Cos(12)) //0.8438539587324921
}
2.16 Tan函数
func Tan(x float64) float64
求正切
func testTan() {
fmt.Println(math.Tan(12)) //-0.6358599286615807
}
2.17 Log函数
func Log(x float64) float64
求自然对数
func testLog() {
fmt.Println(math.Log(2)) //0.6931471805599453
}
2.18 Log2函数
func Log2(x float64) float64
求2为底的对数
func testLog2() {
fmt.Println(math.Log2(128)) //7
}
2.19 Log10函数
func Log10(x float64) float64
求10为底的对数
func testLog10() {
fmt.Println(math.Log10(10000)) //4
}
2.20 Signbit函数
func Signbit(x float64) bool
如果x是一个负数或者负零,返回true
func testSignbit() {
fmt.Println(math.Signbit(10000)) //false
fmt.Println(math.Signbit(-200)) //true
}
三 随机数math/rand
math/rand包是go提供用来产生各种各样随机数的包,注意:rand生成的数值虽然说是随机数,但它其实是伪随机数。
rand实现的几个方法:
func (r *Rand) Int() intfunc (r *Rand) Int31() int32func (r *Rand) Intn(n int) intfunc Int63() int64func Uint32() uint32func Uint64() uint64func Int31n(n int32) int32func Int63n(n int64) int64func Float32() float32func Float64() float64func Perm(n int) []intfunc Read(p []byte) (n int, err error)func NewSource(seed int64) Sourcefunc New(src Source) *Rand
简单使用:
package main
import (
"fmt"
"math/rand"
)
func main() {
// 直接调用rand的方法生成伪随机int值
fmt.Println(rand.Int()) // 5577006791947779410
fmt.Println(rand.Int31()) // 2019727887
fmt.Println(rand.Intn(5)) // 2
}
但是当把代码运行多次发现,结果都是一样的。不管怎么运行代码,产生的结果都是这三个数,结果不会变。这是因为我们还没有设置随机数种子的原因。
func (r *Rand) Seed(seed int64)
使用给定的seed来初始化生成器到一个确定的状态,这就是设置随机种子。
修改之后的代码:
package main
import (
"fmt"
"math/rand"
)
func main() {
// 直接调用rand的方法生成伪随机int值
rand.Seed(time.Now().Unix()) // 设置种子,我们以当前时间的秒;当然也可以用毫秒,微秒等
fmt.Println(rand.Int())
fmt.Println(rand.Int31())
fmt.Println(rand.Intn(5))
}
上面的代码,多次运行,就会发现,结果是不一样的了。
实例演示:
package main
import (
"fmt"
"math/rand"
"time"
)
func init() {
// 以时间作为初始化种子
rand.Seed(time.Now().UnixNano())
}
func myRand() {
for i := 0; i < 10; i++ {
a := rand.Int()
fmt.Printf("a: %v\n", a)
}
fmt.Println("----------")
for i := 0; i < 10; i++ {
a := rand.Intn(100)
fmt.Printf("a: %v\n", a)
}
fmt.Println("----------")
for i := 0; i < 10; i++ {
a := rand.Float32()
fmt.Printf("a: %v\n", a)
}
fmt.Println("----------")
source := rand.NewSource(time.Now().UnixNano()) // 使用当前的纳秒生成一个随机源,也就是随机种子。NewSource()方法就等价于前面的rand.Seed()方法,都是用来设置随机种子。,这两种方法本质上没有区别。
ran := rand.New(source) // 生成一个rand
fmt.Println(ran.Int()) // 获取随机数
}
func main() {
myRand()
}
运行结果:
[Running] go run "c:\Users\Mechrevo\Desktop\go_pro\test.go"
a: 2747499284525365438
a: 5365777377470063010
a: 5393822013296326728
a: 66585880898315113
a: 4899864187477679104
a: 5671463064765054987
a: 1628987576203792162
a: 4240383513709586548
a: 8260616810166433828
a: 8947672088031463840
----------
a: 2
a: 54
a: 65
a: 78
a: 42
a: 79
a: 54
a: 12
a: 95
a: 16
----------
a: 0.8290653
a: 0.9650742
a: 0.66692156
a: 0.58227015
a: 0.61942315
a: 0.25878242
a: 0.5057827
a: 0.6954045
a: 0.6151818
a: 0.6623065
----------
1397204733291272645
[Done] exited with code=0 in 2.152 seconds