数学库

简介: 数学库

Lua 语言提供了标准数学库 math标准数学库由一组标准的数学函数组成,包括三角函数sincostanasin 等)、指数函数取整函数最大最小函数maxmin 、用于生成伪随机数的伪随机函数random )以及常量 pihuge (最大可表示数值,在大多数平台上代表 inf )。


所有的三角函数都是以弧度为单位,并通过函数 degred 进行角度弧度转换。


随机数发生器

函数 math.random 用于生成伪随机数,共有三种调用方式。

  • 当不带参数调用时,该函数将返回一个在 [0, 1) 范围内均匀分布的伪随机数。
  • 当使用带有一个整型值n的参数调用时,该函数将返回一个在 [1, n] 范围内的伪随机整数。例如,可以通过调用random(6)来模拟掷骰子的结果。
  • 当使用带有两个整数值lu的参数调用时,该函数返回在[l, u]范围内的伪随机数。


函数 randomseed 用于设置伪随机数发生器的种子,该函数的唯一参数就是数值类型的种子。在一个程序启动时,系统国定使用 1 为种子初始化伪随机数发生器。如果不设置其他的种子,那么每次程序运行时都会生成相同的伪随机数序列。从调试角度看,这是一个不错的特性,然而,对于一个游戏来说却会导致相同的场景重复不断的出现。为了解决这个问题,通常调用 math.randomseed(os.time()) 来使用当前系统时间作为种子初始化随机数发生器。


取整函数

数学库提供了三个取整函数: floorceilmodf 。作用如下表所示:

函数 作用
floor 向负无穷取整
ceil 向正无穷取整
modf 向零取整


当取整结果能够用整型表示时,返回结果为整型值,否则返回浮点型值(当然,表示的还是整数值)。


除了返回取整后的值以外,函数 modf 还会返回小数部分作为第二个结果。

> math.floor(3.3)           --> 3
> math.floor(-3.3)          --> -4
> math.ceil(3.3)            --> 4
> math.ceil(-3.3)           --> -3  
> math.modf(3.3)            --> 3   0.3
> math.modf(-3.3)           --> -3   -0.3
> math.floor(2^70)          --> 1.1805916207174e+21


如果参数本身就是一个整型值,那么它将被原样返回。


如果将数值 x 向最近的整数取整,可以对 x+0.5 调用 floor 函数。不过,当参数是一个很大的整数时,简单的加法可能会导致错误。例如,考虑如下代码:

x = 2 ^ 52 + 1
print(string.format("%d %d", x, math.floor(x + 0.5)))
  --> 4503599627370497 4503599627370498


252 + 1.5的浮点值表示是不精确的,因此内部会以我们不可控的方式取整。为了避免这个问题,我们可以单独的处理整数值:

function round(x)
    local f = math.floor(x)
    if x == f then
        return f
    else
        return math.floor(x + 0.5)
    end
end


上面的函数总是会向上取整半个整数


如果想进行无偏取整,即向距离最近的偶数取半个整数,上述公式在 x+0.5 是奇数的情况下会产生不正确的结果

> math.floor(3.5 + 0.5)   --> 4 (ok)
> math.floor(2.5 + 0.5)   --> 4 (wrong)


这时,还是可以利用取整操作来解决上述公式中存在的问题:表达式 x%2.0==0.5 只会在 x+0.5奇数时(也就是我们的公式会出错的情况)为真。基于这些情况,定义一个无偏取整函数就简单多了,如下所示:

function round(x)
    local f = math.floor(x)
    if (x == f) or (x % 2 == 0.5) then
        return f
    else
        return math.floor(x + 0.5)
    end
end
print(round(2.5))     --> 2
print(round(3.5))     --> 4
print(round(-2.5))    --> -2  
print(round(-1.5))    --> -2
目录
相关文章
|
存储 关系型数据库 MySQL
linux环境安装8.0以上版本的MySQL详细教程(亲测好用)
linux环境安装8.0以上版本的MySQL详细教程(亲测好用)
3792 0
|
人工智能 物联网 文件存储
基于EasyAnimate模型的视频生成最佳实践
EasyAnimate是阿里云PAI平台自主研发的DiT的视频生成框架,它提供了完整的高清长视频生成解决方案,包括视频数据预处理、VAE训练、DiT训练、模型推理和模型评测等。本文为您介绍如何在PAI平台集成EasyAnimate并一键完成模型推理、微调及部署的实践流程。
|
数据采集 关系型数据库 MySQL
基于Python对二手车之家的数据采集与分析
本文介绍了基于Python的二手车之家数据采集与分析系统,通过爬虫技术获取数据并利用Pandas和NumPy等库进行数据处理与分析,旨在帮助用户了解二手车市场趋势并制定交易策略。
672 2
基于Python对二手车之家的数据采集与分析
|
10月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
交易平台---架构设计第一步拆分模块,拆分为7个模块
交易平台---架构设计第一步拆分模块,拆分为7个模块
|
机器学习/深度学习 算法 大数据
[ICLR 2024] 基于Pathways架构的自适应多尺度时间序列预测模型Pathformer
阿里云计算平台大数据基础工程技术团队主导,与华东师范大学数据科学与工程学院合作的论文《Pathformer: Multi-Scale Transformers With Adaptive Pathways For Time Series Forecasting》被ICLR 2024接收,该论文提出了基于Pathways架构的自适应多尺度时间序列预测模型Pathformer,它从时间分辨率和时间距离角度进行多尺度时序建模,同时进一步提出自适应Pathways来动态调整多尺度建模过程,基于两者,Pathformer在阿里云数据集和公开数据集上取得SOTA预测效果,并展现出不错的泛化性和迁移性。
|
存储 IDE C#
C#入门:在JetBrains Rider中创建.Net Framework控制台应用程序,输出“Hello, World!”
C#入门:在JetBrains Rider中创建.Net Framework控制台应用程序,输出“Hello, World!”
1458 0
|
机器学习/深度学习 人工智能 自然语言处理
如何使用Sora?OpenAI Sora 介绍及使用教程
2024年2月16日,OpenAI 在其官网上面正式宣布推出文本生成视频的大模型 Sora, Sora能够根据简单的文本描述,生成高达60秒的高质量视频,使得视频创作变得前所未有的简单和高效。
如何使用Sora?OpenAI Sora 介绍及使用教程
SyntaxError: await is only valid in async function
SyntaxError: await is only valid in async function
|
Web App开发 缓存 负载均衡
什么是HTTP代理?HTTP代理的作用?HTTP代理怎么设置?
HTTP代理是一种充当客户端和服务器之间的中间人的服务器。当客户端发起请求时,HTTP代理会拦截请求并将其转发给目标服务器。一旦目标服务器响应,HTTP代理会拦截响应并将其转发回客户端。HTTP代理可以被用于多种场景,例如加强安全、缓存内容以加速访问、访问受限资源等等。在这篇文章中,我们将会讨论HTTP代理的作用、类型以及如何设置它。
什么是HTTP代理?HTTP代理的作用?HTTP代理怎么设置?