• 编程笔记 Golang基础 045 math包


    Go 语言的标准库 math 提供了一系列基础数学函数和常量,用于进行科学计算、几何计算和其他数学相关的操作。以下是一些 math 包中的核心功能和函数。

    一、math包

    主要功能

    Go 语言的标准库 math 包主要用于解决各种基础和高级数学运算问题,它提供了大量数学函数和常量,服务于编程中涉及的数学需求。math 包主要解决的问题包括但不限于以下几个方面:

    1. 三角函数计算

      • 正弦(Sin)、余弦(Cos)、正切(Tan)、反正弦(Asin)、反余弦(Acos)、反正切(Atan)以及相应的双曲函数。
    2. 指数和对数运算

      • 自然对数(Log,以 e 为底),常用对数(Log10,以 10 为底),指数函数(Exp),幂运算(Pow),以及针对特定场景优化的 Log1p(用于计算 log(1+x) 避免精度损失)。
    3. 超越函数

      • 幂运算(如平方根Sqrt)、伽马函数(Gamma)、误差函数(Erf)、互补误差函数(Erfc)以及其他特殊函数如 Bessel 函数(J0, J1 等)。
    4. 浮点数操作

      • 浮点数的绝对值(Abs)、取整(Floor, Ceil, Trunc)、四舍五入(Round)、分解为分数和指数形式(Frexp 和 Ldexp)、判断是否为无穷大或NaN(IsInf, IsNaN)以及处理浮点数边界问题(如最小非零正浮点数)。
    5. 几何计算

      • 求直角三角形边长关系(如 Hypot 函数计算欧几里得范数),以及模运算(Mod)。
    6. 数学常数

      • 提供了常用的数学常数,如圆周率 Pi 和自然对数的底数 e。
    7. 比较和取值限制

      • 提供了 Min 和 Max 函数来获取两个数之间的较大或较小值。

    常量:

    • math.MaxFloat64math.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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    运行结果

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    函数:

    数值运算:

    • math.Abs(x float64) float64 返回 x 的绝对值。
    • math.Ceil(x float64) float64 返回大于或等于 x 的最小整数。
    • math.Floor(x float64) float64 返回小于或等于 x 的最大整数。
    • math.Pow(x, y float64) float64 返回 xy 次方。
    • 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 返回 ex 次方。

    随机数相关:

    虽然 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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    此外,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)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    三、示例代码二

    生成随机数。

    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)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    小结

    通过这些函数和常量的支持,math 包使得 Go 程序员能够方便地在程序中进行精确的数学计算和分析,覆盖了大多数实际编程中可能遇到的基础数学需求。同时,math 包也是构建更复杂算法和数学应用的基础模块。

  • 相关阅读:
    如何用Python获取网页指定内容
    Docker学习笔记
    mysql优化之索引
    第二章Redis概述安装
    【WSL2教程】WSL迁移到非系统盘
    m基于GA遗传算法的分件供送螺杆参数优化matlab仿真,优化参数包括螺杆总尺寸-最大圈数等
    如何在自动化测试中使用MitmProxy获取数据返回?
    代码随想录66——额外题目【回溯、贪心】:52N皇后II、649Dota2 参议院、1221分割平衡字符串
    详解一下HTML的语义化标签
    webpack相关面试题
  • 原文地址:https://blog.csdn.net/qq_40071585/article/details/136410637