(摘自Lua程序設計)
數值常量
從Lua5.3版本開始Lua語言為數值格式提供了兩種選擇:被稱為integer的64位整形和被稱為float的雙精度浮點類型(注意,"float"代表雙精度),對於資源受限的平台,可以使用Lua精簡模式,32位整形和單精度浮點型。
具有十進制小數或者指數的數值會被當作浮點類型,否則會被當作整形值。
整形和浮點型值的類型都是"number"
type(3) --> number
type(3.5) --> number
type(3.0) --> number
由於整型值和浮點型值的類型都是"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
我們通常可以通過增加0.0的方法將整型強制轉換為浮點型
算術運算
除了加減乘除,取負數登常見的運算符外,Lua語言還支持取整除法(floor除法),取模和指數運算。
對於Lua5.3中引入的整型而言,主要的建議就是:開發人員要么選擇忽略整型和浮點型的不同,要么就完整的控制每一個數值的表示。
兩個整型進行相加相減相乘和取負的結果仍然是整型值。
如果兩個操作數都是整型值,那么結果也是整型值;否則就是浮點型值。
當操作數一個是整型,一個是浮點型時,Lua語言會在進行算術運算之前先把整型轉為浮點型。
由於兩個整數的相除結果不一定是整數,因此除法運算操作的結果永遠是浮點型值。
Lua5.3針對整數除法引入了一個稱為floor除法的新運算符//。顧命思意floor除法會對得到的商向負無窮取整,從而保證結果是一個整數。這樣floor除法和其他的算術運算符遵循一樣的規則:如果操作數都為整型,結果就為整型,否則就是浮點型值。
3 // 2 --> 1
3.0 // 2 --> 1.0
取模運算的定義:
a % b == a - ((a // b) * b)
取模運算也遵從算術運算的規律,如果兩個數位整型那么結果就為整型,否則為浮點型。
其結果符號永遠與第二個操作數符號保持一致,對於任意的正常量K,即使x是負數,x%K的結果也永遠在[0, K - 1]之間。
對於實數類型的操作數而言,取模運算有一些不同。
x = math.pi
--保留兩位小數
x - x % 0.01 --> 3.14
--保留三位小數
x - x%0.001 --> 3.141
Lua語言同時支持冪運算,使用符號^表示。
關系運算
< > <= >= == ~= 這些關系運算的結果都是Boolean類型。
==用於相等性測試,~=用於不等性測試。這兩個運算符可以應用於任意兩個值,當這兩個值得類型不同時,Lua會認為他們是不相等得。否則,會根據它們的類型再進行比較。
比較數值時應永遠忽略數值的子類型,數值究竟以整型還是浮點類型表示並無區別,只與算數值有關。(盡管如此,比較具有相同子類型的數值時效率更高)
數學庫:
Lua包括三角函數(sin, cos, tan, asin等),指數函數,取整函數,最大和最小函數max和min,用於生成偽隨機數的函數(random)以及常量pi和huge(最大可表示數值,相當於多數平台的inf)
所有的三角函數都是以弧度為單位,並通過函數deg和rad進行角度和弧度的轉換。
math.random用於生成偽隨機數,共有三種調用方式。
1.當不帶參數調用時,該函數將返回一個在[0,1)范圍內均勻分布的偽隨機整數。
2.當使用帶有一個帶整型值n的參數時,該函數將返回一個在[1,n]范圍內的偽隨機整數。
3.當使用帶有兩個整型值l和r的參數調用時,該函數返回在[l, r]范圍內的偽隨機整數。
函數randomseed用於設置偽隨機數發生器的種子,該函數唯一參數就是數值類型的種子。當一個程序啟動時,系統會固定使用1作為種子初始化偽隨機數發生器。如果不設置其他的種子,那么每次程序運行時都會生成相同的偽隨機數序列。
通常調用math.randomseed(os.time())來使用當前系統時間作為種子初始化隨機數發生器。
取整函數:
數學庫提供了三個取整函數: floor, ceil, modf。
其中floor向負無窮取整,ceil向正無窮取整,modf向零取整。當取整結果能夠用整型表示時,返回結果為整型值,否則返回浮點型值。除了返回取整后的值以外,函數modf還會返回小數部分作為第二個結果。
math.floor(3.3) -->3
math.ceil(3.3) -->4
math.modf(303) --> 3 0.3
如果參數本身就是一個整數值,那么它將原樣返回。
如果想將數值向最近的整數取整,可以對x + 0.5調用floor函數。
當參數是一個很大的數時,簡單的加法可能會出錯。
列如當x = 2^52 + 1時
2^52 + 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
標准Lua使用64個比特位來存儲整型值,其最大值為2的63次方 - 1,約等於10的19次方;精簡Lua使用32個比特位存儲整型值,其最大值約為20億。數學庫中的常量定義了整型值得最大值和最小值(math.maxinteger和math.mininteger)
當我們在整型操作時出現比mininteger更小或者比maxinteger更大的數值是,結果就會回環。
math.maxinteger + 1 == math.mininteger --> true
math.mininteger - 1 == math.maxinteger --> true
運算符優先級
(從上到下,最上為最大)
^
一元運算符(- #(求長度) ~ not)
* / // %
+ -
..(字符串連接)
<< >>
&
~(按位異或)
|
< > <= >= ~= ==
and
or