目录
注:本系列为《Lua程序设计-第4版》 的读书笔记,其中的见解有不完善的地方,可以在评论区指出,原版请看图书
1. 通过增加0.0 的方法将整型值强制转换为浮点型值,一个整型值总是可以被转换成浮点型值(整型强转浮点)
2. 通过与零进行按位或运算,可以把浮点数强制装换为整型值:(浮点强转整型)
3. 使用函数 math.tointeger,可以把数值强转为整型值:(强转整型)
注:本系列为《Lua程序设计-第4版》 的读书笔记,其中的见解有不完善的地方,可以在评论区指出,原版请看图书
在Lua5.2及之前的版本中,所有的数值都以双精度浮点格式表示。从Lua5.3版本开始,Lua语言为数值格式提供了两种选择:被称为 integer 的64位整型 和 被称为 float 的双精度浮点类型。
小知识:
对于那些资源受限的平台,我们可以将Lua5.3编译为精简Lua模式,在该模式中使用32位整型和单精度浮点类型。
一. 数值常量:
我们可以使用科学计数法书写数值常量,例如:
> 4 --> 4
> 0.4 --> 0.4
> 4.57e-3 --> 0.00457
> 0.3e12 --> 300000000000.0
>5E+20 --> 5e+20
具有十进制小数或者指数的数值会被当作浮点型值,否则会被当作整型值
整型值和浮点型值的类型都是"number":
--相同算术值的整型值和浮点型值在Lua语言中是相等的
> 1 == 1.0 --> true
> -3 == -3.0 --> true
> 0.2e3 == 200 --> true
在少数情况下,当需要区分整型值和浮点型值时,可以使用函数math.type:
> math.type(3) --> integer
> math.type(3.0) --> float
Lua语言也支持0X开头的十六进制常量,与其他很多编程语言不同,Lua语言还支持十六进制的浮点数,这种十六进制浮点数由小数部分和以p和P开头的指数部分组成。例如:
> 0xff --> 255
> 0x1A3 --> 419
> 0x0.2 --> 0.2
> 0x1p-1 --> 0.5
> 0xa.bp2 --> 42.75
可以使用 %a参数,通过函数string.format 对这种格式进行格式化输出:
> string.format("%a", 419) --> 0x1.a3p+8
> string.format("%a", 0.1) --> 0x1.999999999999ap-4
二. 算术运算:
除了加、减、乘、除、取负数等常见的算法,Lua语言还支持 取整除法(floor除法)、取模和指数运算
两个整型值进行相加、相减、相乘和取负操作的结果仍然是整型值。操作数是用整型还是用浮点型表示的整数没有区别
> 13 + 15 --> 28
> 13.0 + 15.0 --> 28.0
两个操作数都是整型值,那么结果也是整型值;否则,结果就是浮点值。
当操作数一个是整型值一个是浮点值时,Lua语言会在算术运算前 先将整型值转换为 浮点值
2.1 整数除法(floor 除法)//
含义:floor除法会对得到的商向负无穷取整,从而保证结果是一个整数
> 3 // 2 --> 1
> 3.0 // 2 --> 1.0
> 6 // 2 --> 3
> -9 // 2 -- -5
> 1.5 // 0.5 --> 3.0
以下公式是取模运算的定义:
a % b == a - ((a // b) * b)
2.2 取模运算%
含义:对于任意指定的正常量K,即使x是负数,表达式 x%K的结果也永远在 [0,k-1]之间
取模用法1:
判断是一个是否被2整除?来确定奇偶性
解:表达式 i % 2 结果均为 0 或 1
取模用法2:
判断A 是否大于或小于B
解: A % B ,如果A 小于等于B ,其结果是 A
取模用法3:
判断以N为一周期, X是否溢出?溢出值是多少
取模用法4:
X 保留 N位小数:x-x%0.01 恰好是x保留两位小数的结果、 x-x%0.001 恰好是x保留三位小数的结果
解:
> x = math.pi
> x - x%0.01 --> 3.14
> x - x%0.001 --> 3.141
取模用法5:
表达式 angle%(2*math.pi) 实现了将任意范围的角度归一化到 [0,2Π)之间
三.关系运算
Lua语言提供了下列关系运算:
< > <= >= == ~=
其结果都是Boolean类型
四. 数学库
Lua语言提供了标准数学库 math。标准数学库由一组标准的数学函数组成,包括三角函数(sin、cos、tan、asin等)、指数函数、取整函数、最大和最小函数max和min、用于生成伪随机数的伪随机函数(random)以及常量pi和huge.
所有的三角函数都以弧度为单位,并通过函数deg 和 rad进行角度和弧度的转换。
1.1 随机数发生器math.random
1.2 取整函数 floor、ceil和modf
序号 | 方法&用途 |
1 | math.random() 用于生成伪随机函数,共有三种调用方式 a.当不带参数调用时,该函数将返回一个在 [0,1)范围内均匀分布的伪随机整数 b. 当带有一个整型值n的参数调用时,该函数将返回一个在[0,n)范围内均匀分布的伪随机整数 c. 当带有两个整型值 L 和 U 的参数调用时,该函数返回在[L,U]范围内的伪随机整数 |
2 | math.floor() 向负无限取整 用法1: 将数值X 向最近的整数取整,可以对x+0.5调用math.floor()函数 |
3 | math.ceil() 向正无限取整 |
4 | math.modf() 向零取整 |
五. 数值转化惯例用法:
1. 通过增加0.0 的方法将整型值强制转换为浮点型值,一个整型值总是可以被转换成浮点型值(整型强转浮点)
> -3 + 0.0 --> -3.0
> 0x7fffffffffffffff + 0.0 --> 9.2233720368548e+18
注意:小于2^53(即9007199254740992)的所有整型值得表示与双精度浮点型值的表示一样,对于绝对值超过了这个值的整型值而言,在将其强制转换为浮点值时可能导致精度损失:
> 9007199254740992 + 0.0 == 9007199254740992 -->true
> 9007199254740993 + 0.0 == 9007199254740993 -->false
2. 通过与零进行按位或运算,可以把浮点数强制装换为整型值:(浮点强转整型)
> 2^53 --> 9.007199254741e+15(浮点型)
> 2^53 | 0 --> 900719925440992(整型值)
注意:在浮点型强转整型值时,Lua语言会检查数值是否与整型值表示完全一致,即没有小数部分且其值在整型值的表示范围内,如果不满足条件会抛出异常,例;
> 3.2 | 0 --> 小数部分
stdin:1: number has no integer representation
> 2^64 | 0 -->超出范围
stdin:1: number has no integer representation
> math.random(1, 3.5)
stdin:1: bad argument #2 to 'random'(数值没有用整型表示)
3. 使用函数 math.tointeger,可以把数值强转为整型值:(强转整型)
> math.tointeger(-258.0) --> -258
> math.tointeger(2^30) --> 1073741824
> math.tointeger(5.01) --> nil (不是整数值)
> math.tointeger(2^64) --> nil (超过范围)
六. 运算符优先级:(优先级从高到低)
^
一元运算符(- # ~ not)
* / // %
+ -
.. (连接)
<< >> (按位移位)
& (按位与)
~ (按位异或)
| (按位或)
< > <= >= ~= ==
and
or
在二元运算符中,除了幂运算和连接操作符是右结合的外,其他运算符都是左结合。
当不能确定某些表达式的运算符优先级时,应该用显式地用括号来指定所希望的运算次序,增加阅读性