# Go语言数学计算的秘密武器：big包详解

1. big 包介绍与背景

big 包的主要功能

big 包提供了以下高精度计算功能:

BigInt：无限大小的整数

BigFloat：高精度的浮点数

BigRat：高精度的有理数

big 包的基本特点

2. 基本数据类型与初始化

Int 类型

big包中最基本的数据类型是Int，它可以表示任意精度的有符号整数。下面是一个Int类型的初始化示例：

import (    "fmt"    "math/big")
func main() {    num := big.NewInt(1234567890)    fmt.Println("Big Int:", num)}

Rat 类型

Rat类型表示有理数，即分数。它用两个Int类型的数值表示分子和分母。以下是一个Rat类型的初始化示例：

import (    "fmt"    "math/big")
func main() {    num1 := big.NewRat(1, 2) // 1/2    num2 := big.NewRat(3, 4) // 3/4        sum := new(big.Rat)    sum.Add(num1, num2) // 1/2 + 3/4 = 5/4        fmt.Println("Sum:", sum)}

3. 高精度整数操作

import (    "fmt"    "math/big")
func main() {    num1 := new(big.Int)    num1.SetString("12345678901234567890", 10)        num2 := new(big.Int)    num2.SetString("98765432109876543210", 10)        sum := new(big.Int)    sum.Add(num1, num2)        fmt.Println("Sum:", sum)}

import (    "fmt"    "math/big")
func main() {    num1 := new(big.Int)    num1.SetString("98765432109876543210", 10)        num2 := new(big.Int)    num2.SetString("12345678901234567890", 10)        diff := new(big.Int)    diff.Sub(num1, num2)        fmt.Println("Difference:", diff)}

import (    "fmt"    "math/big")
func main() {    num1 := new(big.Int)    num1.SetString("12345678901234567890", 10)        num2 := new(big.Int)    num2.SetString("98765432109876543210", 10)        product := new(big.Int)    product.Mul(num1, num2)        fmt.Println("Product:", product)}

import (    "fmt"    "math/big")
func main() {    num1 := new(big.Int)    num1.SetString("98765432109876543210", 10)        num2 := new(big.Int)    num2.SetString("12345678901234567890", 10)        quotient := new(big.Int)    quotient.Div(num1, num2)        fmt.Println("Quotient:", quotient)}

4. 高精度浮点数操作

import (    "fmt"    "math/big")
func main() {    num1 := new(big.Rat)    num1.SetString("3/5")        num2 := new(big.Rat)    num2.SetString("1/5")        diff := new(big.Rat)    diff.Sub(num1, num2)        fmt.Println("Difference:", diff)}

import (    "fmt"    "math/big")
func main() {    num1 := new(big.Rat)    num1.SetString("2/3")        num2 := new(big.Rat)    num2.SetString("3/4")        product := new(big.Rat)    product.Mul(num1, num2)        fmt.Println("Product:", product)}

import (    "fmt"    "math/big")
func main() {    num1 := new(big.Rat)    num1.SetString("2/3")
num2 := new(big.Rat)    num2.SetString("1/4")        quotient := new(big.Rat)    quotient.Quo(num1, num2)        fmt.Println("Quotient:", quotient)}

5. 高精度数学函数

import (    "fmt"    "math/big")
func main() {    base := new(big.Rat)    base.SetString("2")        exponent := new(big.Int)    exponent.SetString("10")        result := new(big.Rat)    result.Exp(base, exponent)        fmt.Println("Result:", result)}

import (    "fmt"    "math/big")
func main() {    num := new(big.Rat)    num.SetString("25")        sqrt := new(big.Rat)    sqrt.Sqrt(num)        fmt.Println("Square Root:", sqrt)}

import (    "fmt"    "math/big"    "math")
func main() {    angle := new(big.Rat)    angle.SetString("45")        sinValue := new(big.Rat)    sinValue.Sin(angle)        cosValue := new(big.Rat)    cosValue.Cos(angle)        tanValue := new(big.Rat)    tanValue.Tan(angle)        fmt.Println("Sin(45°):", sinValue)    fmt.Println("Cos(45°):", cosValue)    fmt.Println("Tan(45°):", tanValue)}

6. 大整数的比较与格式化

import (    "fmt"    "math/big")
func main() {    num1 := new(big.Int)    num1.SetString("12345678901234567890", 10)        num2 := new(big.Int)    num2.SetString("98765432109876543210", 10)        cmpResult := num1.Cmp(num2)    switch cmpResult {    case -1:        fmt.Println("num1 < num2")    case 0:        fmt.Println("num1 = num2")    case 1:        fmt.Println("num1 > num2")    }}

import (    "fmt"    "math/big")
func main() {    num := new(big.Int)    num.SetString("12345678901234567890", 10)        str := num.String()    fmt.Println("Formatted String:", str)}

7. 高级应用：大整数的 RSA 加解密

import (    "crypto/rand"    "crypto/rsa"    "fmt"    "math/big")
func main() {    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)    if err != nil {        fmt.Println("Error generating private key:", err)        return    }
publicKey := &privateKey.PublicKey
fmt.Println("Private Key:", privateKey)    fmt.Println("Public Key:", publicKey)}

import (    "crypto/rand"    "crypto/rsa"    "fmt")
func main() {    message := []byte("Hello, RSA!")
// 加密    publicKey, err := rsa.GenerateKey(rand.Reader, 2048)    if err != nil {        fmt.Println("Error generating public key:", err)        return    }    ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, &publicKey, message)    if err != nil {        fmt.Println("Error encrypting message:", err)        return    }
// 解密    plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, publicKey, ciphertext)    if err != nil {        fmt.Println("Error decrypting message:", err)        return    }
fmt.Println("Original message:", string(plaintext))}

8. 性能优化与注意事项

9. 总结

Go 语言大数包 big 提供了 BigInt、BigFloat 和 BigRat 三种高精度计算类型。

big 包的类型与方法设计简洁高效,可以很容易地进行大数计算。

|
15天前
|
Go
go语言中的数据类型
go语言中的数据类型
13 0
|
21天前
|
Go 开发者

23 0
|
21天前
|

30 0
|
21天前
|

36 0
|
21天前
|

24 0
|
1天前
|

【Go语言快速上手(二)】 分支与循环&函数讲解
【Go语言快速上手(二)】 分支与循环&函数讲解
16 5
|
1天前
|
Go
Golang深入浅出之-Go语言基础语法：变量声明与赋值
【4月更文挑战第20天】本文介绍了Go语言中变量声明与赋值的基础知识，包括使用var关键字和简短声明:=的方式，以及多变量声明与赋值。强调了变量作用域、遮蔽、初始化与零值的重要性，并提醒读者注意类型推断时的一致性。了解这些概念有助于避免常见错误，提高编程技能和面试表现。
12 0
|
1天前
|

Go语言入门｜包、关键字和标识符
Go语言入门｜包、关键字和标识符
13 0
|
2天前
|

Go语言爬虫示例使用chromedp库下载Instagram图片，关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务，如导航至用户页面、截图并存储图片。代码中新增analyzeAndStoreImage函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
28 1
|
5天前
|
API Go

19 1