仓颉编程语言 std.math 数学基础运算实战:clamp、gcd、lcm 与 rotate 详解
文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载导读本文以仓颉编程语言标准库std.math包中的四个高频基础运算函数——范围截断clamp、最大公约数gcd、最小公倍数lcm、按位旋转rotate为核心结合 math_basic_operation.md 示例与 math_package_funcs.md API 文档逐函数讲解其函数签名、参数语义、返回值规则、异常边界与可运行示例。读完本文你将能够直接在仓颉工程中正确导入并调用这四个函数处理数值限幅、分数化简、周期计算与位级数据变换等典型场景。一、std.math 包概览std.math是仓颉标准库中的数学工具包在 math_package_overview.md 中将其能力划分为五类科学常数与类型常数定义如E、PI等浮点常数属性浮点数的判断与规整isNaN、isInf、normalize等常用的位运算rotate、reverse、countOnes、leadingZeros、trailingZeros等通用的数学函数绝对值、三角函数、指数、对数、开方、幂运算等最大公约数与最小公倍数gcd、lcm。其中clamp属于范围截断类工具函数。这些函数均为顶层公开函数public func使用时需按函数粒度精确导入例如import std.math.clamp、import std.math.gcd、import std.math.lcm、import std.math.rotate而不能使用包级通配导入。二、clamp浮点数范围截断2.1 函数签名与语义clamp将输入值限制在[min, max]闭区间内为Float16、Float32、Float64三种浮点类型各提供一版重载以Float16为例源码定义public func clamp(v: Float16, min: Float16, max: Float16): Float16参数与返回值规则参数/返回值含义v传入的需要截断的浮点数min指定范围区间的最小值max指定范围区间的最大值返回值v在区间内则返回vv小于等于min返回minv大于等于max返回maxv为NaN时返回NaN异常当min大于max或min、max中存在NaN时抛出 IllegalArgumentException。2.2 边界行为分析clamp的三个典型分支在示例中均有覆盖示例源码值在区间内v 0.121、区间[-0.123, 0.123]返回值等于v值超过上界v 11.121大于max2 10.123返回max2值低于下界v -1.121小于min3 -0.999返回min3。import std.math.clamp func clampTest() { let min: Float16 -0.123 let max: Float16 0.123 let v: Float16 0.121 let c clamp(v, min, max) println(${cv}) let min2: Float16 -0.999 let max2: Float16 10.123 let v2: Float16 11.121 let c2 clamp(v2, min2, max2) println(${c2max2}) let min3: Float16 -0.999 let max3: Float16 10.123 let v3: Float16 -1.121 let c3 clamp(v3, min3, max3) println(${c3min3}) }注意NaN的传递性若v本身是NaN返回值仍是NaNNaN与任何值的比较结果都为假因此需要专门处理而若min/max为NaN则直接抛出IllegalArgumentException这是调用时最容易踩的坑。三、gcd最大公约数3.1 函数签名与语义gcd为Int8、Int16、Int32、Int64及UInt8、UInt16、UInt32、UInt64共 8 种整数类型提供重载以Int16为例源码定义public func gcd(x: Int16, y: Int16): Int16参数x、y为需要计算最大公约数的两个整数返回两者非负最大公约数。异常边界当两个参数同时为有符号整数最小值或一个参数为有符号整数最小值且另一个参数为 0时抛出 IllegalArgumentException。原因在于对最小值取绝对值会溢出该类型表示范围无法安全计算。3.2 示例与结果示例中的两个用例恰好体现了 gcd 对负数与零的处理示例源码import std.math.gcd func gcdTest() { let c2 gcd(0, -60) println(c2${c2}) let c4 gcd(-33, 27) println(c4${c4}) }运行结果c260 c43gcd(0, -60)返回60当入参含 0 时公约数取另一参数的绝对值说明 gcd 的结果恒为非负gcd(-33, 27)返回3负数入参先取绝对值再计算33与27的最大公约数为3。四、lcm最小公倍数4.1 函数签名与语义lcm同样覆盖 8 种整数类型以Int8为例源码定义public func lcm(x: Int8, y: Int8): Int8返回值规则返回两个整数的最小的非负公倍数只有当入参有 0 时才返回 0这与某些语言实现不同需特别留意。异常当计算结果超出当前整数类型的最大值时抛出 IllegalArgumentException。这意味调用前应预估lcm的数值量级避免溢出例如两个接近Int8.MAX的数相乘极易越界。4.2 示例与结果import std.math.lcm func lcmTest() { let a: Int8 lcm(Int8(-3), Int8(5)) println(a${a}) }运行结果a15lcm(-3, 5)返回15虽然入参含负数但结果取非负公倍数。由lcm(x, y) |x * y| / gcd(x, y)可知3与5互质其最小公倍数为15与gcd(0, -60)60形成对照gcd 与 lcm 互为配套的整数值运算常用于分数约分、周期对齐等场景。五、rotate整数按位旋转5.1 函数签名与语义rotate将整数的二进制位按循环方式旋转覆盖全部 8 种整数类型以Int8为例源码定义public func rotate(num: Int8, d: Int8): Int8参数说明API 文档参数含义num传入一个整数d旋转位数负数右移正数左移旋转rotate与普通移位shift的关键区别在于移出的高位/低位不会被丢弃而是从另一端循环补回因此位数本身不会丢失特别适合校验码计算、哈希扩散、加密类位级变换等场景。5.2 示例结果的手工验证import std.math.rotate func rotateTest() { let a: Int8 rotate(Int8(92), Int8(4)) println(a${a}) let b: Int32 rotate(Int32(1), Int8(4)) println(b${b}) }运行结果a-59 b16rotate(Int8(92), 4)92的二进制为0101 11008 位左旋 4 位后各半字节互换得到1100 0101。由于最高位为 1按有符号Int8解释该二进制补码即为-59rotate(Int32(1), 4)1左旋 4 位后最低位的 1 被移到第 4 位得到2^4 16。第二个用例印证了rotate与的区别若用普通左移1 4同样得到16但当移位数超过位宽时例如Int8类型旋转 8 位应回到原值rotate会循环回卷而普通移位会直接丢弃。六、完整示例程序与运行结果以下为 math_basic_operation.md 中给出的完整可运行程序将四个函数汇总于一个main()中便于整体验证import std.math.clamp import std.math.gcd import std.math.lcm import std.math.rotate // 范围截断示例 func clampTest() { let min: Float16 -0.123 let max: Float16 0.123 let v: Float16 0.121 let c clamp(v, min, max) println(${cv}) let min2: Float16 -0.999 let max2: Float16 10.123 let v2: Float16 11.121 let c2 clamp(v2, min2, max2) println(${c2max2}) let min3: Float16 -0.999 let max3: Float16 10.123 let v3: Float16 -1.121 let c3 clamp(v3, min3, max3) println(${c3min3}) } // 求两个数的最大公约数 func gcdTest() { let c2 gcd(0, -60) println(c2${c2}) let c4 gcd(-33, 27) println(c4${c4}) } // 求两个数的最小公倍数 func lcmTest() { let a: Int8 lcm(Int8(-3), Int8(5)) println(a${a}) } // 整数按二进制某一位前后翻转 func rotateTest() { let a: Int8 rotate(Int8(92), Int8(4)) println(a${a}) let b: Int32 rotate(Int32(1), Int8(4)) println(b${b}) } main(): Unit { println(/*********************** clampTest **********************/) clampTest() println(/*********************** gcdTest ************************/) gcdTest() println(/*********************** lcmTest ************************/) lcmTest() println(/*********************** rotateTest *********************/) rotateTest() }运行结果/*********************** clampTest **********************/ true true true /*********************** gcdTest ************************/ c260 c43 /*********************** lcmTest ************************/ a15 /*********************** rotateTest *********************/ a-59 b16七、实战要点与边界总结综合 math_package_funcs.md 的 API 约束归纳四个函数的调用要点导入粒度四个函数分别位于独立的子模块中需按import std.math.xxx逐函数导入clamp 的 NaN 语义v为NaN时静默返回NaN而min/max为NaN或min max时抛IllegalArgumentException写防御性代码时应先校验区间合法性gcd 的溢出边界两参数同为最小值、或最小值和 0 组合时会抛异常因为内部取绝对值会溢出lcm 的溢出边界结果超过类型最大值即抛异常入参含 0 时返回 0其余情况返回最小的非负公倍数入参符号不影响结果rotate 的方向约定正数左旋、负数右旋循环回卷不丢位有符号类型旋转后可能得到负数高位为 1 时按补码解释跨类型使用时如Int32(1)配合Int8(4)注意位宽与类型匹配。相关 API 延伸这四个函数属于 math_package_overview.md 所列能力中的“常用位运算”与“最大公约数与最小公倍数”两组。若需要进一步了解整数/浮点类型的通用能力可查阅 math_package_interfaces.md 中的IntegerT接口提供%、、|、^、、等运算符约定与NumberT接口若需要精细控制舍入行为可参考 math_package_enums.md 中的RoundingMode枚举包含 IEEE 754 约定的 5 种规则及常用的四舍五入HalfUp。位运算家族中还提供reverse按位反转、countOnes、leadingZeros、trailingZeros等函数与rotate配合可完成各种位级变换需求。赞分享文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载相关推荐仓颉编程语言 std.math 数学库实战指南常数、浮点处理、位运算与数学函数全解析仓颉编程语言 std.math 数学库实战指南常数、浮点处理、位运算与数学函数全解析 std.math 是仓颉标准库中面向通用数值计算的工具包覆盖科学常数与文档知识库教程OpenHarmony仓颉语言 std.math 数值抽象接口全解Number、FloatingPoint、Integer 与泛型编程实践仓颉语言 std.math 数值抽象接口全解Number、FloatingPoint、Integer 与泛型编程实践 std.math 是仓颉编程语言标准库中文档知识库教程OpenHarmony仓颉语言 std.math 数学函数 API 全面指南绝对值、三角/双曲函数、取整、位运算与数论函数实战仓颉语言 std.math 数学函数 API 全面指南绝对值、三角/双曲函数、取整、位运算与数论函数实战 导读 std.math 是仓颉Cangjie编程文档知识库教程OpenHarmony上一篇Salt 的 solaris_shadow 执行模块在 Solaris 上管理密码数据库的完整指南下一篇Yii 2 页面缓存实战基于 PageCache 过滤器的整页服务端缓存指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考