数学库

简介: 数学库

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
目录
相关文章
|
2月前
|
存储
在Arduino中使用数学库
在Arduino中使用数学库,可以通过包含`<math.h>`头文件来访问一系列数学函数,如sin、cos、tan等。使用这些函数前需确保已正确引入库,并了解各函数参数与返回值类型,以便进行精准的数学运算。
|
2月前
|
编译器
Zig 函数
Zig 函数
51 1
|
4月前
|
数据挖掘 Python
NumPy求解微分方程:轻松掌握科学计算的利器
NumPy求解微分方程:轻松掌握科学计算的利器
89 0
|
5月前
|
Python
NumPy 数学函数库详解
【8月更文第30天】NumPy(Numerical Python)是 Python 中用于科学计算的核心库之一,它提供了大量的高性能数学函数,并且是其他许多科学计算库的基础。本文将详细介绍 NumPy 中的数学函数,包括统计函数、线性代数函数以及傅里叶变换等功能。
97 0
|
8月前
|
Python
用Python的Numpy求解线性方程组
用Python的Numpy求解线性方程组
|
8月前
|
机器学习/深度学习 算法 搜索推荐
SciPy线性代数库详解:矩阵运算与方程求解
【4月更文挑战第17天】SciPy的`scipy.linalg`模块提供丰富的线性代数功能,包括矩阵运算、线性方程组求解、特征值问题和奇异值分解等,基于BLAS和LAPACK库确保效率与稳定性。关键操作如矩阵乘法使用`dot`函数,转置和共轭转置用`transpose`和`conj`,求解线性方程组有`solve`和迭代方法,计算特征值和向量用`eig`,奇异值分解则依赖`svd`。这个库对科学计算、数据分析和机器学习等领域至关重要。
|
8月前
|
C语言
常见的数学库函数
常见的数学库函数
139 0
|
Python
Python 用sympy做高数题,不定积分、定积分、极限、求导样样精通!
Python 用sympy做高数题,不定积分、定积分、极限、求导样样精通!
385 0
|
存储 索引 Python
矩阵基本运算的设计与实现(Python)
矩阵基本运算的设计与实现(Python)
210 0
科学计算库Numpy-矩阵操作
科学计算库Numpy-矩阵操作