【Lua学习】数值number和数学库math

类型显示

Lua中number表示数值,无论是整数、浮点数、指数、负数,都用number表示。在Lua5.3以后,Lua 为数值格式提供了两种子类型,分别是 integer 的 64 位整型和 float 的双精度浮点型值。

所有的数值使用type函数都能获得相同的结果,也就是number。而想知道该数值是整型还是浮点型,则需要使用math库的type函数。

type(-3) -> number
type(3.0) -> number
math.type(-3) -> integer
math.type(3.0) -> float

算数运算

1.整数间运算

在Lua中,整数与整数相加、相减、相乘,结果为整数;相除,结果为浮点数。

math.type(3+5) --> math.type(8) --> integer
math.type(3-5) --> math.type(-2) --> integer
math.type(3*5) --> math.type(15) --> integer
math.type(3/5) --> math.type(0.6) --> float

2.整数与浮点数的运算

在Lua中,整数与浮点数进行运算,结果为浮点数。

math.type(3.0+5) --> math.type(8.0) --> float
math.type(3.0-5) --> math.type(-2.0) --> float
math.type(3.0*5) --> math.type(15.0) --> float
math.type(3.0/5) --> math.type(0.6) --> float

3.浮点数间运算

浮点数与浮点数进行运算,结果为浮点数(不举例了)。

4.特殊除法//

Lua使用//来表示特殊除法,类似于C或C++的整数除法,整数和整数相除,结果还是整数,会向负无穷取整到最接近的整数。

45 // 11 -> 4
3.0 // 2 -> 1.0

5.取模运算

Lua进行取模运算,使用%。其中a % b 相当于 a – ((a // b) * b)。

45 % 11 --> 1
45 - ((45 // 11) * 11) --> 1

Tips:巧妙保留小数

有时我们需要保留小数点后n位,使用取模运算即可完成。

x = 3.1415926
x - x % 0.01 --> 3.14
x - x % 0.001 --> 3.141

6.幂运算

Lua使用^表示幂运算。要注意,幂运算的结果永远是浮点数。

4 ^ 2 --> 16.0 --计算平方
4 ^ 0.5 --> 2.0 --计算平方根
27 ^ (1/3) --> 3.0 --计算立方根

关系运算

关系运算,就是小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、等于(==)、不等于(~=)。

需要注意的是,两个值类型不同,就是不等,不考虑子类型(整型和浮点型)。

3 < 5 --> true
3 > 5 --> false
3 < = 5 --> true
3 > = 5 --> false
3 == 5 --> false
3 ~= 5 --> true

数学库math

说是math库,其实只是一个名为math的表。这个库提供了基本的数学函数,它将所有函数和常数放在math表内。

常用计算

求绝对值math.abs (x)

返回x和-x之间的最大值。

math.abs(-3.6) --> 3.6
math.abs(3.6) --> 3.6

求余数math.fmod (x, y)

返回x除以y的余数,该余数将商四舍五入到零。

math.fmod(4, 3) --> 1
math.fmod(4, 3.5) --> 0.5
math.fmod(4.5, 3.5) --> 1.0

求对数math.log (x [, base])

返回以给定底数为base的x的对数。默认情况下,base是e(因此函数返回x的自然对数)。

math.log(4, 2) --> 2.0

求e的x次幂math.exp (x)

返回e的x次幂(其中e是自然对数的底数)。

math.exp(1) --> 2.718281828459

求平方根math.sqrt (x)

返回x的平方根。(你也可以使用表达式x^0.5来计算这个值。)

math.sqrt(4) --> 2.0

三角函数

获得π值math.pi

获得π值。

math.pi --> 3.1415926535898

角度转弧度math.rad (x)

将角度从度转换为弧度。

math.rad(30) --> 0.5235987755983 --将角度30度转换为弧度。1度=π/180

弧度转角度math.deg (x)

将角度x从弧度转换为度。

math.deg(0.5235987755983) --> 30.0 --将弧度0.5235987755983转换为角度。1弧度=180/π

求正弦值math.sin (x)

返回x的正弦值,以弧度为单位。

math.sin(math.rad(30)) --> 0.5 --将30度角先转换成弧度,再求正弦值

求余弦值math.cos (x)

返回x的余弦值,以弧度为单位。

math.cos(math.rad(60)) --> 0.5 --将60度角先转换成弧度,再求余弦值

求正切值math.tan (x)

返回x的正切值(假设x是以弧度为单位)。

math.tan(math.rad(45)) --> 1.0 --将45度角先转换成弧度,再求正切值

求反正弦值math.asin (x)

返回x的反正弦值,以弧度为单位。

math.deg(math.asin(0.5)) --> 30.0 --求0.5的反正弦值,再将结果转换成角度

求反余弦值math.acos (x)

返回x的反余弦值,以弧度为单位。

math.deg(math.acos(0.5)) --> 60.0 --求0.5的反余弦值,再将结果转换成角度

求反正切值math.atan (y [, x])

返回y的反正切值,以弧度为单位。其中x是可选的,默认值为1。y代表对边,x代表斜边,如果不传入x,y相当于y/x。使用x和y两个参数的符号来确定结果的象限。它也能正确处理y为零的情况。

math.deg(math.atan(1.0)) --> 45.0--求1.0的反正切值,再将结果转换成角度

取整函数

向正无穷取整math.ceil (x)

返回大于或等于x的最小整数值。

math.ceil(3.3) -> 4
math.ceil(-3.3) -> -3

向负无穷取整math.floor (x)

返回小于或等于x的最大整数值。

math.floor(3.3) -> 3
math.floor(-3.3) -> -4

向零取整math.modf (x)

返回x的整数部分和小数部分。它的第二个结果始终是一个浮点数。

math.modf(3.3) -> 3 0.3
math.modf(-3.3) -> -3 -0.3
math.modf(3) -> 3 0.0
math.modf(-3) -> -3 0.0

最大最小值

获得浮点数的最大值math.huge

一个大于任何其他数值的浮点值,C语言中的HUGE_VAL。

math.huge --> inf --inf代表infinite,无穷的意思。

获得整数最大值math.maxinteger

返回整数的最大值。

math.maxinteger --> 9223372036854775807

获得整数的最小值math.mininteger

返回整数的最小值。

math.mininteger --> -9223372036854775808

TIPS:

--最大值加1等于最小值

math.maxinteger + 1 == math.mininteger -> true
--最小值减1等于最大值
math.mininteger - 1 == math.maxinteger -> true
--负最小值等于正最小值
-math.mininteger == math.mininteger -> true
--最小值除以-1等于最小值
math.mininteger // -1 == math.mininteger -> true
--最小值转换16进制,比最大值大1
string.format("0x%x", math.mininteger) --> 0x8000000000000000
--最大值转换16进制,比最小值小1
string.format("0x%x", math.maxinteger) --> 0x7fffffffffffffff

求最大值math.max (x, …)

返回一组数值的最大值。

math.max (10, 50, 60, 30, 20, 70, 80, 40) --> 80

求最小值math.min (x, …)

返回一组数值的最小值。

math.min(10, 50, 60, 30, 20, 70, 80, 40) --> 10

随机数

求随机值math.random ([m [, n]])

当不带参数调用时,返回一个在区间[0,1)内具有均匀分布的伪随机浮点数。

math.random() --> 0.32537081887154

当使用两个整数m和n调用时,返回一个在区间[m, n]内具有均匀分布的伪随机整数。

math.random(1, 10) --> 6
对于正整数n,调用math.random(n)等同于调用math.random(1,n)。

math.random(5) --> 3
调用math.random(0)会产生一个所有位都是(伪)随机的整数。此函数使用xoshiro256**算法来生成伪随机64位整数,这些整数是带参数0的调用的结果。其他结果(范围和浮点数)是从这些整数中无偏提取的。
Lua使用相当于不带参数调用math.randomseed的方式来初始化其伪随机生成器,因此math.random应该每次程序运行时都能生成不同的结果序列。

math.random(0) --> -7073313417451957552
math.random(0) --> 2110367830168838180

求随机种子math.randomseed ([x [, y]])

当至少带一个参数调用时,整数参数x和y被合并成一个128位的种子,用于重新初始化伪随机生成器;相同的种子会产生相同的数字序列。y的默认值是零。
当不带参数调用时,Lua会生成一个种子,其中包含对随机性的微弱尝试。
此函数返回实际使用的两个种子组件,因此再次设置它们将重复序列。
为了确保初始状态达到所需的随机性水平(或者相反,为了有一个确定性的序列,例如在调试程序时),你应该使用明确的参数调用math.randomseed。

一般使用os.time()作为种子。

math.randomseed(os.time()) --> 1726496864 0

其它

转换整数math.tointeger (x)

如果值x可以转换为整数,则返回该整数。否则,返回失败。

math.tointeger(3.0) --> 3
math.tointeger("3.0") -->3
math.tointeger("55ff") --> nil

获得类型math.type (x)

如果x是整数,则返回”integer”;如果x是浮点数,则返回”float”;如果x不是数字,则返回fail。

math.type(3) --> integer
math.type(3.0) --> float
math.type("3") --> nil

math.ult (m, n)

如果m和n以无符号整数进行比较时,m < n,那么返回true,否则返回false。

math.ult(2,3) --> true
math.ult(-2,3) --> false

TIPS: math.ult(-2,3) –> false
在 Lua 中,math.ult(m, n) 函数比较两个整数的无符号值。当使用 math.ult(-2, 3) 时,结果将是 false。这是因为当 -2 和 3 被视为无符号整数时,它们的二进制表示如下:

-2 在32位系统中通常表示为 0xFFFFFFFE(因为它是 0x00000002 的二进制补码表示,取反加一)。

3 在32位系统中表示为 0x00000003。

在无符号比较中,0xFFFFFFFE(即 -2 的无符号表示)实际上是一个非常大的正整数,因为它在内存中的位模式表示的是一个大于 0x7FFFFFFF(即32位系统中的最大有符号整数值)的数。而 0x00000003 是一个相对较小的正整数。
因此,0xFFFFFFFE(无符号的 -2)大于 0x00000003(3),所以 math.ult(-2, 3) 返回 false。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容