【读书笔记】语言基础-数值(四)

目录

注:本系列为《Lua程序设计-第4版》 的读书笔记,其中的见解有不完善的地方,可以在评论区指出,原版请看图书

小知识:

一. 数值常量:

二. 算术运算:

2.1 整数除法(floor 除法)//

2.2 取模运算%

        取模用法1:

        取模用法3:

        取模用法4:

         取模用法5:

三.关系运算

四. 数学库

1.1 随机数发生器math.random

1.2 取整函数 floor、ceil和modf

五.  数值转化惯例用法:

        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

在二元运算符中,除了幂运算和连接操作符是右结合的外,其他运算符都是左结合

不能确定某些表达式的运算符优先级时,应该用显式地用括号来指定所希望的运算次序,增加阅读性

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值