数学库

简介: 数学库

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
目录
相关文章
|
10天前
|
存储
在Arduino中使用数学库
在Arduino中使用数学库,可以通过包含`<math.h>`头文件来访问一系列数学函数,如sin、cos、tan等。使用这些函数前需确保已正确引入库,并了解各函数参数与返回值类型,以便进行精准的数学运算。
|
18小时前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
20 6
|
1月前
标准库函数中的数学函数
数学函数是标准库函数的重要组成部分,提供了包括三角函数、对数函数、指数函数、幂函数等在内的多种常用数学运算功能,广泛应用于科学计算和工程领域。
|
4月前
|
Python
NumPy 数学函数库详解
【8月更文第30天】NumPy(Numerical Python)是 Python 中用于科学计算的核心库之一,它提供了大量的高性能数学函数,并且是其他许多科学计算库的基础。本文将详细介绍 NumPy 中的数学函数,包括统计函数、线性代数函数以及傅里叶变换等功能。
56 0
|
5月前
|
存储 Serverless Python
`quad()` 函数是 `scipy.integrate` 模块中的一个函数,用于计算一维函数的数值积分。其基本语法如下:
`quad()` 函数是 `scipy.integrate` 模块中的一个函数,用于计算一维函数的数值积分。其基本语法如下:
|
7月前
|
Python
Python中的math和cmath模块:数学运算的得力助手
Python作为一种功能强大的编程语言,提供了丰富的数学运算功能。其中,math和cmath模块就是Python中用于数学运算的重要工具。math模块提供了基本的数学函数和常量,适用于实数运算;而cmath模块则提供了对复数运算的支持,使得Python在数学计算和工程应用中更加灵活和强大。
|
7月前
|
C语言
常见的数学库函数
常见的数学库函数
118 0
|
存储 编解码 Serverless
C语言实现DFT计算
本文主要介绍了利用C语言实现DFT计算的思路并给出了程序设计
319 0
|
C语言 C++
C语言标准库(常用函数)详解(含示例)数学公式:math.h
C语言标准库(常用函数)详解(含示例)数学公式:math.h
1003 0
|
存储 C++
OpenBLAS 中矩阵运算函数学习
OpenBLAS 中矩阵运算函数学习
480 0