編程筆記 Golang基礎 045 math包
- 一、math包
- 主要功能
- 常量:
- 函數:
- 數值運算:
- 三角函數:
- 對數函數:
- 隨機數相關:
- 二、示例代碼一
- 三、示例代碼二
- 小結
Go 語言的標準庫
math
提供了一系列基礎數學函數和常量,用于進行科學計算、幾何計算和其他數學相關的操作。以下是一些math
包中的核心功能和函數。
一、math包
主要功能
Go 語言的標準庫 math
包主要用于解決各種基礎和高級數學運算問題,它提供了大量數學函數和常量,服務于編程中涉及的數學需求。math
包主要解決的問題包括但不限于以下幾個方面:
-
三角函數計算:
- 正弦(Sin)、余弦(Cos)、正切(Tan)、反正弦(Asin)、反余弦(Acos)、反正切(Atan)以及相應的雙曲函數。
-
指數和對數運算:
- 自然對數(Log,以 e 為底),常用對數(Log10,以 10 為底),指數函數(Exp),冪運算(Pow),以及針對特定場景優化的 Log1p(用于計算 log(1+x) 避免精度損失)。
-
超越函數:
- 冪運算(如平方根Sqrt)、伽馬函數(Gamma)、誤差函數(Erf)、互補誤差函數(Erfc)以及其他特殊函數如 Bessel 函數(J0, J1 等)。
-
浮點數操作:
- 浮點數的絕對值(Abs)、取整(Floor, Ceil, Trunc)、四舍五入(Round)、分解為分數和指數形式(Frexp 和 Ldexp)、判斷是否為無窮大或NaN(IsInf, IsNaN)以及處理浮點數邊界問題(如最小非零正浮點數)。
-
幾何計算:
- 求直角三角形邊長關系(如 Hypot 函數計算歐幾里得范數),以及模運算(Mod)。
-
數學常數:
- 提供了常用的數學常數,如圓周率 Pi 和自然對數的底數 e。
-
比較和取值限制:
- 提供了 Min 和 Max 函數來獲取兩個數之間的較大或較小值。
常量:
math.MaxFloat64
和math.SmallestNonzeroFloat64
分別表示 IEEE-754 浮點數的最大值和最小非零正值。math.Pi
表示圓周率 π。math.E
表示自然對數的底數 e。
示例代碼
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("圓周率默認為:%.200f\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.14159265358979311599796346854418516159057617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
函數:
數值運算:
math.Abs(x float64) float64
返回x
的絕對值。math.Ceil(x float64) float64
返回大于或等于x
的最小整數。math.Floor(x float64) float64
返回小于或等于x
的最大整數。math.Pow(x, y float64) float64
返回x
的y
次方。math.Sqrt(x float64) float64
返回x
的平方根。math.Cbrt(x float64) float64
返回x
的立方根。
三角函數:
math.Sin(x float64) float64
返回x
弧度的正弦值。math.Cos(x float64) float64
返回x
弧度的余弦值。math.Tan(x float64) float64
返回x
弧度的正切值。- 還有它們的反函數如
math.Asin
,math.Acos
,math.Atan
,以及雙角形式如math.Sinh
,math.Cosh
,math.Tanh
等。
對數函數:
math.Log(x float64) float64
返回x
的自然對數(以e
為底)。math.Log10(x float64) float64
返回x
的以10為底的對數。math.Exp(x float64) float64
返回e
的x
次方。
隨機數相關:
雖然 math
包本身不直接提供隨機數生成器,但 math/rand
子包提供了生成偽隨機數的功能:
rand.Intn(n int) int
返回一個在 [0, n) 范圍內的隨機整數。rand.Float64() float64
返回 [0.0, 1.0) 范圍內的隨機浮點數。
要使用這些函數,你需要導入對應的包:
import ("fmt""math"
)func main() {// 示例用法val := math.Sin(math.Pi / 2)fmt.Println(val)
}
此外,math
包還包含其他高級數學函數,比如求最大公約數 (GCD
)、最小二乘解 (Sqrt
)、反正切函數的完整范圍版本 (Atan2
) 等。通過查閱官方文檔可以獲得更完整的函數列表和詳細說明。
二、示例代碼一
package mainimport ("fmt""math"
)func main() {/*取絕對值,函數簽名如下:func Abs(x float64) float64*/fmt.Printf("[-3.14]的絕對值為:[%.2f]\n", math.Abs(-3.14))/*取x的y次方,函數簽名如下:func Pow(x, y float64) float64*/fmt.Printf("[2]的16次方為:[%.f]\n", math.Pow(2, 16))/*取余數,函數簽名如下:func Pow10(n int) float64*/fmt.Printf("10的[3]次方為:[%.f]\n", math.Pow10(3))/*取x的開平方,函數簽名如下:func Sqrt(x float64) float64*/fmt.Printf("[64]的開平方為:[%.f]\n", math.Sqrt(64))/*取x的開立方,函數簽名如下:func Cbrt(x float64) float64*/fmt.Printf("[27]的開立方為:[%.f]\n", math.Cbrt(27))/*向上取整,函數簽名如下:func Ceil(x float64) float64*/fmt.Printf("[3.14]向上取整為:[%.f]\n", math.Ceil(3.14))/*向下取整,函數簽名如下:func Floor(x float64) float64*/fmt.Printf("[8.75]向下取整為:[%.f]\n", math.Floor(8.75))/*取余數,函數簽名如下:func Floor(x float64) float64*/fmt.Printf("[10/3]的余數為:[%.f]\n", math.Mod(10, 3))/*分別取整數和小數部分,函數簽名如下:func Modf(f float64) (int float64, frac float64)*/Integer, Decimal := math.Modf(3.14159265358979)fmt.Printf("[3.14159265358979]的整數部分為:[%.f],小數部分為:[%.14f]\n", Integer, Decimal)
}
三、示例代碼二
生成隨機數。
package mainimport ("fmt""math/rand""time"
)func init() {//以時間作為初始化種子rand.Seed(time.Now().UnixNano())
}
func main() {for i := 0; i < 10; i++ {a := rand.Int()fmt.Println(a)}fmt.Println("------------")for i := 0; i < 10; i++ {a := rand.Intn(100)fmt.Println(a)}fmt.Println("------------")for i := 0; i < 10; i++ {a := rand.Float32()fmt.Println(a)}
}
小結
通過這些函數和常量的支持,math
包使得 Go 程序員能夠方便地在程序中進行精確的數學計算和分析,覆蓋了大多數實際編程中可能遇到的基礎數學需求。同時,math
包也是構建更復雜算法和數學應用的基礎模塊。