当前位置: 首页 > news >正文

GO语言入门:常用数学函数2

14.6 大型数值

math/big 包中公开了一些实用 API,用于表示大型整数值和浮点数值。当基础类型无法容纳要使用的数值时,应改用 big 包中提供的新类型。例如 Int、Float 等。

14.6.1 大型整数值之间的运算

若希望让下面两个整数值完成加、减法运算,这样编写代码会发生错误。

var (a uint64 = 8000006554217002143024b uint64 = 6676225236988563328930
)
c1 := a + b
c2 := a - b
fmt.Printf("%d + %d = %d\n", a, b, c1)
fmt.Printf("%d - %d = %d\n", a, b, c2)

运行程序会得到如下的错误信息:

constant 8000006554217002143024 overflows uint64
constant 6676225236988563328930 overflows uint64

原因是数值太大,已经超过uint64类型的有效范围。

解决方案只能使用 big 包中的 Int 类型。下面的代码将重新实现上述两个整数进行加、减运算的功能。

// 两个整数值的字符串形式
var (num1 = "8000006554217002143024"num2 = "6676225236988563328930"
)
// 实例化 Int 对象,使用指针类型(*Int)
var bigInt1 = new(big.Int)
var bigInt2 = new(big.Int)
// 将两个字符串表示的值设置到 Int 对象中
bigInt1.SetString(num1, 10)
bigInt2.SetString(num2, 10)
// 进行加法运算
var res1 = new(big.Int)
res1.Add(bigInt1, bigInt2)
fmt.Printf("%d + %d = %d\n", bigInt1, bigInt2, res1)
// 进行减法运算
var res2 = new(big.Int)
res2.Sub(bigInt1, bigInt2)
fmt.Printf("%d - %d = %d\n", bigInt1, bigInt2, res2)

由于基础的整数类型(例如 int64、uint64)均无法容纳两个大型整数值,所以只能用字符串来表示。

num1 = "8000006554217002143024"
num2 = "6676225236988563328930"

然后,调用 Int 实例的 SetString 方法将整数值设置到 Int 实例中。如果要设置的值未超出基础类型的有效范围,是可以使用 SetInt64 SetUint64 方法的。

两个大型整数值进行加减运算后,其结果也是大型数值,因此也需要使用 Int 对象来存储计算结果。加法运算调用 Add 方法,减法运算调用Sub方法。

res1.Add(bigInt1, bigInt2)
res2.Sub(bigInt1, bigInt2)

运行上述程序,将得到以下计算结果:

8000006554217002143024 + 6676225236988563328930 = 14676231791205565471954
8000006554217002143024 - 6676225236988563328930 = 1323781317228438814094

big 包中的类型对象一般会使用指针类型(如 *Int、 *Float 等)。一方面,指针类型仅引用对象的地址,保证在调用各种方法(如上面用到的 Add 方法)过程中所传递的都是唯一的实例;另一方面,这些类型实例存储的数值很大,占用内存空间也比较多,不适宜频繁复制(非指针类型变量在赋值时会复制对象,而指针类型变量仅复制对象的内存地址)。

14.6.2 阶乘运算

阶乘的计算结果往往较大,极有可能超出基础整数类型的范围,因此使用big.Int类型来存储阶乘运算的结果较为合适。

big.Int 类型是可以直接进行阶乘运算的,因为它有一个名为 MulRange 的方法,其签名如下:

func MulRange(a int64, b int64) *Int

它的功能是产生[a, b]范围内的所有整数的积(包含 a 和 b)。运用这个方法便可以轻松完成阶乘运算,即将求积的整数范围设定在 [1, n] [2, n]。例如,要求 5 的阶乘,可以这样调用方法:

MulRange(1, 5)
或者
MulRange(2, 5)

下面的示例分别求 30 和 50 的阶乘。

var c = new(big.Int)
// 求 30 的阶乘
c.MulRange(1, 30)
fmt.Printf("30! = %d\n", c)
// 求 50 的阶乘
c.MulRange(1, 50)
fmt.Printf("50! = %d\n", c)

计算结果如下:

30! = 265252859812191058636308480000000
50! = 304140932017133780436126081660647688443776415689605120000000000000

14.6.3 使用大型浮点数值

big 包中的 Float 类型与 Int 类型相似,专用于存储大型的浮点数值。

下面的代码将创建 Float 对象,并设置一个大型的浮点数值。

var strfloat = "0.001234567890234567893456789"
var bigFloat = new(big.Float)
// 设置精度
bigFloat.SetPrec(50)
// 设置浮点数值
bigFloat.SetString(strfloat)
// 打印到屏幕上
fmt.Printf("%.50f\n", bigFloat)

SetPrec 方法用来设置浮点数值的精度,上述代码中设置为 50。随后调用 SetString 方法将字符串表示的浮点数设置到 Float 对象中。

浮点数值打印结果如下:

0.00123456789023456726950289663591320277191698551178

由于二进制运算存在误差,打印出来的数值与原值会有差异。

Float 结构体还定义了一些可进行常见运算的方法。例如,Add 方法支持加法运算,Sub 方法支持减法运算。

下面的示例将演示大型浮点数值的四则运算。

步骤 1:定义两个 float64 类型的变量,作为 Float 对象的原始数值。

var (a float64 = 1550.797220660354896132160489549963189232654585896489465456159657b float64 = 0.0016200166894105953690156
)

步骤 2:创建三个 Float 对象实例。

var (bigFa = new(big.Float)bigFb = new(big.Float)bigRes = new(big.Float) // 存放计算结果
)

步骤 3:设置精度。

bigFa.SetPrec(100)
bigFb.SetPrec(100)
bigRes.SetPrec(100)

步骤 4:设置原始数值。

bigFa.SetFloat64(a)
bigFb.SetFloat64(b)

如果数值很大,超过了float64类型的可容纳范围,则可以使用字符串来表示数值,再调用 SetString 方法来设置。

步骤 5:完成四则运算。

// 加
bigRes.Add(bigFa, bigFb)
fmt.Printf("%.15f + %.15f = %.15f\n", bigFa, bigFb, bigRes)// 减
bigRes.Sub(bigFa, bigFb)
fmt.Printf("%.15f - %.15f = %.15f\n", bigFa, bigFb, bigRes)// 乘
bigRes.Mul(bigFa, bigFb)
fmt.Printf("%.15f * %.15f = %.15f\n", bigFa, bigFb, bigRes)// 除
bigRes.Quo(bigFa, bigFb)
fmt.Printf("%.15f / %.15f = %.15f\n", bigFa, bigFb, bigRes)

步骤 6:运行示例,结果如下所示:

1550.797220660354924 + 0.001620016689411 = 1550.798840677044334
1550.797220660354924 - 0.001620016689411 = 1550.795600643665513
1550.797220660354924 * 0.001620016689411 = 2.512317379361341
1550.797220660354924 / 0.001620016689411 = 957272.373054734186086

相关文章:

GO语言入门:常用数学函数2

14.6 大型数值 math/big 包中公开了一些实用 API,用于表示大型整数值和浮点数值。当基础类型无法容纳要使用的数值时,应改用 big 包中提供的新类型。例如 Int、Float 等。 14.6.1 大型整数值之间的运算 若希望让下面两个整数值完成加、减法运算&#…...

Django 使用教程

Django 使用教程 Django 是一个高级的 Python Web 框架,采用了 MTV(Model-Template-View)设计模式,旨在帮助开发者快速构建高效、可维护的 Web 应用。它有着非常丰富的功能,包括 ORM、用户认证、表单处理、管理后台等…...

deepseek + kimi制作PPT

目录 一、kimi简介二、deepseek生成内容三、生成PPT四、编辑PPT 一、kimi简介 kimi是一款只能ppt生成器,擅长将文本内容生成PPT。 在这里,​​DeepSeek 负责内容生成与逻辑梳理​​,​​Kimi 优化表达与提供设计建议​​。 二、deepseek生…...

C++学习:六个月从基础到就业——内存管理:RAII原则

C学习:六个月从基础到就业——内存管理:RAII原则 本文是我C学习之旅系列的第十九篇技术文章,也是第二阶段"C进阶特性"的第四篇,主要介绍C中的RAII原则及其在资源管理中的应用。查看完整系列目录了解更多内容。 引言 在…...

量子计算与经典计算融合:开启计算新时代

一、引言 随着科技的飞速发展,计算技术正迎来一场前所未有的变革。量子计算作为前沿技术,以其强大的并行计算能力和对复杂问题的高效处理能力,吸引了全球科技界的关注。然而,量子计算并非要完全取代经典计算,而是与经典…...

RV1126网络环境TFTPNFS搭建(二)

二、RV1126 开发板TFTP环境搭建 2.1、Ubuntu下安装和配置 xinetd 执行以下指令,安装 xinetd sudo apt-get install xinetd 执行以下指令创建一个 xinetd.conf 文件 sudo vi /etc/xinetd.conf 修改 xinetd.conf 文件内容如下: # Simple configurat…...

计算机视觉7——齐次坐标与相机内外参

一、透视投影 透视投影(Perspective Projection)是计算机视觉和图形学中描述三维物体在二维平面成像的基础模型,其核心思想是模拟人类视觉系统的成像原理——中心投影。具体而言,三维空间中的点通过一个固定的投影中心&#xff0…...

学习笔记—C++—string(一)

目录 string 为什么学习string的类 string类的常用接口 string类对象的常见构造 string类对象的访问及遍历操作 operator[] 迭代器 范围for auto 迭代器(二) string类对象的容量操作 size,length,max_size,capacity,clear基本用法 reserve 提…...

Linux命令-Shell编程

Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。 写一个hello.sh脚本: 1.mkdir scripts 2.cd scripts 3.touch hello.sh 4.vim hello.sh #!/bin/bash echo "hello,world" 5.bash hello.sh&#xff08…...

基于Django的AI客服租车分析系统

基于Django的AI客服租车分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】AI智能客服与用户交互指导手册 【技术栈】 ①:系统环境:Python 3.8,Django 4.2框架 ②:开发环境&a…...

计算机组成与体系结构:计算机结构的分类(classifications of computer architecture)

目录 Von Neumann Architecture(冯诺依曼结构) Harvard Architecture(哈佛结构) Modified Harvard Architecture(改进哈佛结构) 三种结构对比总结表 💡 从“内存访问结构”角度分类&#x…...

在阿里云和树莓派上编写一个守护进程程序

目录 一、阿里云邮件守护进程 1. 安装必要库 2. 创建邮件发送脚本 mail_daemon.py 3. 设置后台运行 二、树莓派串口守护进程 1. 启用树莓派串口 2. 安装依赖库 3. 创建串口输出脚本 serial_daemon.py 4. 设置开机自启 5. 使用串口助手接收 一、阿里云邮件守护进程 1.…...

Redis 的几种数据类型

Redis 提供了多种数据类型,以支持不同的应用场景。每种数据类型都有其特定的操作方式,并且在内部实现上也有所优化,能够满足不同的业务需求。以下是 Redis 支持的几种常见数据类型: 1. 字符串(String) 描…...

Spring之我见 - Spring Boot Starter 自动装配原理

欢迎光临小站:致橡树 Spring Boot Starter 的核心设计理念是 约定优于配置,其核心实现基于 自动配置(Auto-Configuration) 和 条件化注册(Conditional Registration)。以下是其生效原理: 约定…...

LeRobot 项目部署运行逻辑(二)—— Mobile Aloha 真机部署

LeRobot 在开源项目中详细说明了部署流程,所以首先看一下开源的内容,然后再逐步拆解 首先,LeRobot 开源的硬件是配全部在 examples 文件夹中 包括了 Stretch 3、Aloha and Aloha 2 stationary、SO-100、LeKiwi、Moss v1 等机器人 恰好实验…...

大模型面经 | 介绍一下CLIP和BLIP

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...

Java发生OOM是否必然导致JVM退出

Java发生OOM是否必然导致JVM退出? 核心结论 不一定。OOM是否导致JVM退出取决于以下因素: OOM发生的区域JVM启动参数配置是否捕获了OOM异常 详细分析 1. 不同内存区域的OOM影响 内存区域错误类型默认是否导致JVM退出可恢复性Java堆OutOfMemoryError…...

Docker Compose 外部网络(`external: true`)与内部网络的区别

Docker Compose 外部网络(external: true)与内部网络的区别 在 Docker Compose 中,external: true 声明的外部网络与普通(内部)网络有重要区别,以下是它们的详细对比: 1. 定义与创建方式 特性外部网络 (external: true)内部网络 (默认)创建…...

【Android】Wallpaper学习

从wallpaper的设置来了解相关内容: 一,静态壁纸 静态壁纸设置的原理是在WallpaperManagerService里监听/data/system/users/0/wallpaper_orig相关文件的变化来触发设置,通过相应的组件程序去进行绘制, 相应的组件如&#xff1a…...

Java基础-第一章、基本数据类型

运算符: 1.算术运算符:加减乘除%等 2.逻辑运算符:与或非等 3.关系运算符:大于、小于... 4.赋值运算符: 这里牵扯运算符的运算先后顺序了。 赋值运算的返回值:就是赋值的变量本身...

《Operating System Concepts》阅读笔记:p748-p748

《Operating System Concepts》学习第 64 天,p748-p748 总结,总计 1 页。 一、技术总结 1.Transmission Control Protocol(TCP) 重点是要自己能画出其过程,这里就不赘述了。 二、英语总结(生词:3) transfer, transport, tran…...

Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏

Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏 Project 08 - Digital Hourglass 数字沙漏程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数计时和点亮LED:读取倾斜开关状态:重置LED和计时器:运行过程注意事项Project 08 - …...

报告总结笔记 | Jeff Dean ETH AI趋势 笔记:AI 的重要趋势:我们是如何走到今天的,我们现在能做什么,以及我们如何塑造 AI 的未来?

报告总结笔记 | Jeff Dean ETH AI趋势 笔记:AI 的重要趋势:我们是如何走到今天的,我们现在能做什么,以及我们如何塑造 AI 的未来? 2025年 4 月 14 日,Google Research 及 Google DeepMind 的首席科学家、A…...

RocketMQ实现基于可靠消息的最终一致性

RocketMQ实现基于可靠消息的最终一致性 文章目录 RocketMQ实现基于可靠消息的最终一致性一、RocketMQ应用场景**应用解耦****流量削峰****数据分发** 二、RocketMQ 基础概念1. 核心组件2. 消费模式3. 消息可靠性 三、消息类型按发送方式分同步发送异步发送单向发送 按使用功能特…...

【题解-Acwing】790. 数的三次方根

题目:790. 数的三次方根 题目描述 给定一个浮点数 n,求它的三次方根。 输入 共一行,包含一个浮点数 n 。 输出 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。 数据范围 −10000 ≤ n ≤ 10000 时空限制 1s / 64MB 输入样例 1000.00输出样…...

一键升级OpenSSH/OpenSSL修复安全漏洞

在服务器安全运维过程中,我们经常面临这样的问题:收到高危漏洞通报(如最近的OpenSSH多个CVE漏洞),但Ubuntu系统无法通过apt直接升级到修复版本。这种情况下,传统方法需要手动编译源码,处理依赖关…...

Pycharm 如何删除某个 Python Interpreter

在PyCharm中,点击右下角的“Interpreter Settings”按钮,或者通过菜单栏选择“File” > “Settings”(macOS用户选择“PyCharm” > “Preferences”)。在设置窗口中,导航到“Project: [Your Project Name]” >…...

【C++】深入浅出之多态

目录 多态的概念多态的定义和实现多态的构造条件虚函数虚函数的重写虚函数重写的两个例外协变析构函数作为虚函数重写 C11的override和final重载、重写(覆盖)、隐藏(重定义)的对比相关面试题⭐ 抽象类概念接口继承和实现继承 多态的原理虚函数表多态的原理动态绑定和静态绑定 e…...

精益数据分析(9/126):如何筛选创业路上的关键数据指标

精益数据分析(9/126):如何筛选创业路上的关键数据指标 大家好!在创业的漫漫长路中,数据就像一盏明灯,指引着我们前行的方向。但要让这盏灯发挥作用,关键在于找到那些真正有价值的数据指标。今天…...

【Python爬虫详解】第二篇:HTML结构的基本分析

在上一篇文章中,我们介绍了网络爬虫的基本概念、发展历程和工作原理。要进行有效的网页内容爬取,首先需要理解我们要爬取的对象 —— 网页的基本结构和语法。网页本质上是由HTML代码构成的,爬虫程序需要从HTML中提取我们需要的信息。因此&…...

【C++】 —— 笔试刷题day_21

一、爱丽丝的人偶 题目解析 现在存在n个玩偶,每个玩偶的身高是1、2、3......n; 现在我们要对这些玩偶进行排序(如果x人偶,它左右两边的玩偶一个比x高、一个比x矮,那这个玩偶就会爆炸)。 我们不想要任何一个…...

云点数据读写

一、常见点云数据格式 LAS/LAZ格式 LAS是点云数据的行业标准格式 LAZ是LAS的压缩版本 支持地理参考信息、颜色、强度等属性 PCD格式(Point Cloud Data) PCL(Point Cloud Library)开发的格式 支持ASCII和二进制存储 包含头部信息和数据部分 PLY格式(Polygon File Format…...

Matlab 汽车行驶速度PID控制系统仿真

1、内容简介 Matlab 213-汽车行驶速度PID控制系统仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

STM32嵌入式

一、创建工程项目 1、进入软件首页 2、新建项目,【file】->【new project】 3、选择需要的芯片 4、系统内核部分设置 ① 选择晶振(使用外部的高速晶振) ② 选择debug形式(SW类型) 5、时钟设置 6、选择自己需要的引脚设置&a…...

机器学习(神经网络基础篇)——个人理解篇6(概念+代码)

1 在声明一个类中,构建一个属于类的函数,前面为什要加上“self”? 就像下面这一串代码: class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std0.01):# 初始化权重self.params {}self.p…...

Java学习手册:Filter 和 Listener

在 JavaWeb 开发中,Filter(过滤器)和 Listener(监听器)是两个重要的技术组件,它们在处理客户端请求、管理应用状态和资源以及实现全局逻辑控制等方面发挥着关键作用。 一、Filter(过滤器&#…...

深度学习总结(25)

抽样偏倚问题 非代表性数据有一个特别隐蔽又特别常见的例子,那就是抽样偏倚(sampling bias)​。如果你的数据收集过程与你尝试预测的目标之间存在相互影响,就会出现抽样偏倚,从而导致有偏差的结果。 理解数据 将数据…...

探索 Model Context Protocol (MCP):它如何影响 AI 的表现?

Anthropic 公司 Anthropic 是一家技术实力雄厚的公司,也是大模型领域的重要参与者之一。其开发的 **Claude 模型** 是全球首个以编程能力见长并广受欢迎的大语言模型。这款模型凭借卓越的代码生成和理解能力,迅速成为许多开发者工具的核心组件。例如&am…...

Three.js + React 实战系列-3D 个人主页 :完成 Navbar 导航栏组件

在上一节中,我们搭建了项目的基础结构,搭建好了项目框架。 本节我们将继续完善页面结构,完成第一个视觉组件 —— Navbar 导航栏 ✅ 前置准备: ✅下载静态资源在根目录下 (src 同级)谷歌云盘地址 🎥 02 完成 Navba…...

游戏引擎学习第238天:让 OpenGL 使用我们的屏幕坐标

回顾并为今天的内容做准备 我们已经完成了硬件显示的实现,现在通过GPU来显示游戏。原本以为这会花费很长时间,但结果实际所需的时间并不多。因此,我们现在有了进展,但接下来应该做什么还不确定。虽然有很多事情可以做&#xff0c…...

go+mysql+cocos实现游戏搭建

盲目的学了一段时间了,刚开始从Box2d开始学习,明白了很多,Box2d是物理模型的基础,是我们在游戏中模拟现实的很重要的一个开源工具。后来在朋友的建议下学习了cocos,也是小程序开发的利器,而golang是一款高效…...

Linux 网络基础(二) (传输协议层:UDP、TCP)

目录 一、传输层的意义 二、端口号 1、五元组标识一个通信 2、端口号范围划分 3、知名端口号(Well-Know Port Number) (1)查看端口号 4、绑定端口号数目问题 5、pidof & netstat 命令 (1)ne…...

Vue常用指令入门

1. v-for 作用&#xff1a;用于遍历对象或数组 注意&#xff1a;需要提供key属性&#xff0c;可以提高性能和避免渲染错误&#xff0c;值通常为index或item.id <li v-for"(item, index) in items" :key"index">{{ item }} </li>2. v-if,v-el…...

【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos

关于数据集的整理 Cholec80 胆囊切除手术视频数据集介绍 https://zhuanlan.zhihu.com/p/700024359 数据集信息 Cholec80 数据集 是一个针对内窥镜引导 下的胆囊切除手术视频流程识别数据集。数据集提供了每段视频中总共7种手术动作及总共7种手术工具的标注&#xff0c;标…...

UML统一建模

UML UML&#xff08;统一建模语言&#xff09;介绍 UML&#xff08;统一建模语言&#xff09;介绍 面向对象软件开发需要经过OOA面向对象分析、OOD面向对象设计和OOP面向对象编程三个阶段。OOA对目标系统进行分析并寄哪里分析模型&#xff0c;并将之文档化&#xff0c;OOD用面向…...

Ubuntu下安装和卸载MySQL

Ubuntu下安装和卸载MySQL 下面的演示系统版本&#xff1a;Ubuntu 24.04 更新系统软件包 在开始安装之前&#xff0c;建议先更新系统的软件包列表&#xff0c;以确保所有依赖项是最新的。 sudo apt update && sudo apt upgrade -y安装MySQL服务器 Ubuntu的官方软件…...

物联网技术赋能:复杂环境下的能源数据零丢失

安科瑞顾强 在全球能源挑战日益严峻的背景下&#xff0c;高效节能已成为各行业的核心诉求。无论是商业综合体、工业厂房还是公共设施&#xff0c;如何实现能源的精细化管理成为关键课题。安科瑞能耗云平台凭借其创新技术与多功能服务&#xff0c;为企业提供了一站式能源管理解…...

卷积神经网络综述

摘要 本文对卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;进行了全面综述。首先介绍了卷积神经网络的发展历程&#xff0c;包括早期的理论基础和关键突破。接着详细阐述了卷积神经网络的结构组成&#xff0c;包括卷积层、池化层、全连接层…...

SpringBoot3设置maven package直接打包成二进制可执行文件

注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package&#xff08;注意&#xff1a;使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…...

在 Anaconda 上安装多版本 Python 解释器并在 PyCharm 中配置

默认已安装好 Anaconda 和 PyCharm &#xff0c;想在 Anaconda 上安装最新版本的 Python 解释器。 一、在 Anaconda 上创建虚拟环境 在连网状态下进入系统的命令提示符&#xff08;快捷键&#xff1a;win r &#xff0c;输入 cmd 即可&#xff09;&#xff0c;输入如下命令&a…...