三 、数值
在Lua 5.2及之前的版本,所有数值都以双精度浮点格式表示,从5.3版本开始,Lua语言的number分为integer的64位整型和被称为float的双精度浮点型,若想要32位的整型和单精度浮点类型,可以将Lua 5.3编译为精简Lua(Small Lua)模式.
3.1 数值常量
- 整型值和浮点类型的值都是"number",所以可以互相转换,当需要区分两者时,可以用
> math.type(3) -- integer
> math.type(3.0) -- float
- Lua的十六进制以0x开头,支持十六进制的浮点数,十六进制浮点数由小数部分和以p/P开头的指数部分组成,如
> 0xff
255
> 0x1A3
419
> 0x0.2
0.125
> 0x1p-1
0.5
> 0xa.bp2
42.75
可以使用%a参数进行格式化输出,如:
> string.format("%a",419)
0x1.a3p+8
> string.format("%a",0.1)
0x1.999999999999ap-4
这种格式很难阅读,但是可以保留所有浮点数的精度,并且比十进制转换速度更快
3.2 算术运算
- 向下取整 Lua 5.3 使用 // 符号,5.3之前使用math.floor,我们看下两者的区别
> math.floor(3/2)
1
> 3 // 2
1
> math.floor(3.0/2)
1
> 3.0 // 2
1.0
// 区分整数和浮点数,由于5.3版本之前没有整数的概念,所以math.floor永远返回整数,// 的操作数只要有一个浮点数,则向下取整返回浮点数
取模运算的定义:
a % b == a - ((a // b) * b)
由此可知,取模和取余数差不多,当想要一个值不超过某个范围的时候,就对该值进行取模, 在整数的情况下, a % b 取模的值永远在[1,b-1]范围内,即 5 % 3的取模结果在[1,3]之间
- Lua 语言支持幂运算,计算x的平方根,可以用x0.5,计算x的立方根,可以用x(1/3)
3.3 关系运算
Lua语言的关系运算六种
< > <= >= == ~=
3.4 数学库
标准数学库math,包括三角函数(sin,cos,tan,asin等)、指数函数、取整函数、最大和最小函数max和min,random以及常量pi和huge(最大可表示数值,在大多数平台上代表inf)
- 随机数发生器
math.random
> math.random() --[0,1)
0.84018771676347
> math.random(6) --[1,6]
3
> math.random(6,7) --[6,7]
7
math.randomseed 用于设置伪随机数发生器的种子,看例子就明白了了
> math.randomseed(1)
> math.random()
0.39438292663544
> math.random()
0.78309922339395
> math.randomseed(1)
> math.random()
0.39438292663544
> math.random()
0.78309922339395
> math.randomseed(1)
> math.random()
0.39438292663544
> math.random()
0.78309922339395
> math.randomseed(2)
> math.random()
0.80967634869739
> math.random()
0.088795455172658
math.randomseed每次设置一样的值,则math.random就会生成一样的随机数,不管math.random带不带参数。
- 取整函数
三个取整函数:
floor 向负无穷取整;
ceil 向正无穷取整;
modf 向0取整,并会返回小数部分作为第二个结果;
> 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
如果想将数值x向最近的整数取整,这个问题没看懂??????
3.5 表示范围
数学库中的常量定义了整型值的最大值math.maxinteger和最小值math.mininteger
> math.maxinteger+1 == math.mininteger
true
> math.mininteger-1 == math.maxinteger
true
> -math.mininteger == math.mininteger
true
> math.mininteger // -1 == math.mininteger
true
这段内容也没完全看懂?????
3.6 惯例
整型转行成浮点型
> -3+0.0
-3.0
> 0x7f+0.0
127.0
浮点型转行成整型
> 4.0 | 0
4
> 2.0^5
32.0
> 2.0^5 | 0
32
> 2.3 | 0
stdin:1: number has no integer representation
stack traceback:
stdin:1: in main chunk
[C]: in ?
> math.random(4.5)
stdin:1: bad argument #1 to 'random' (number has no integer representation)
stack traceback:
[C]: in function 'math.random'
stdin:1: in main chunk
[C]: in ?
> math.random(1,4.5)
stdin:1: bad argument #2 to 'random' (number has no integer representation)
stack traceback:
[C]: in function 'math.random'
stdin:1: in main chunk
[C]: in ?
> math.tointeger(3.0)
3
> math.tointeger(3.03)
nil
可以充分利用math.tointeger函数来判断一个数值是否为整数
3.7 运算符优先级
从上到下,优先级从高到低
^
一元运算符(- # ~ not)
* / // %
+ -
.. (连接)
<< >> (按位移位)
& (按位与)
~ (按位异或)
| (按位或)
< > <= >= ~= ==
and
or
在二元运算符中,除了幂运算和连接操作符是右结合外,其他都是左结合
3.8 兼容性
Lua 5.3 支持的最大整数为2^63,而Lua 5.2支持的最大整数为2^53,由于5.2及以下版本没有整数,所以跟整数相关的函数都不支持,如math.type()、math.maxinteger、math.mininteger、math.tointeger等