zoukankan      html  css  js  c++  java
  • Lua程序设计之数值

    (摘自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

  • 相关阅读:
    数据的增、删、改(jQuery.Ajax)
    tomcat内置jdk(tomcat集成jdk)(windows环境)
    进行数据库进程的杀死
    矩阵与自然基向量
    实对称矩阵
    坐标变换
    设置PySpark的Python版本
    CentOS7中安装Python3.6
    一个矩阵有几个实特征向量
    centos7系统设置固定IP
  • 原文地址:https://www.cnblogs.com/lMonster81/p/10433791.html
Copyright © 2011-2022 走看看