Golang基础 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 main import ( "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 main import ( "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 包也是构建更复杂算法和数学应用的基础模块。