Skip to content

Commit

Permalink
Finished 'src/lua_tut/numbers.md'.
Browse files Browse the repository at this point in the history
  • Loading branch information
gnu4cn committed Nov 1, 2023
1 parent a8acc16 commit 33da272
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions src/lua_tut/numbers.md
Original file line number Diff line number Diff line change
Expand Up @@ -621,8 +621,13 @@ x^y^z <--> x^(y^z)
在 Lua 5.3 中引入整数,并不是偶然的,其与以前的 Lua 版本,几乎没有不兼容的地方。正如我(作者)所说的,程序员大多可以忽略整数和浮点数之间的差异。当我们忽略这些差异时,我们也可以忽略 Lua 5.3 与 Lua 5.2 之间的差异,在 Lua 5.2 中,所有数字都是浮点数。(关于数字,Lua 5.0 和 Lua 5.1 与 Lua 5.2 完全一样)。


当然,Lua 5.3 和 Lua 5.2 之间的主要不兼容性,在于整数的表示限制。Lua 5.2 最多只能表示到 `2^53` 精确整数,而 Lua 5.3 的限制为 `2^63`。在计数时,这种差异很少成为问题。但是,当数字要表示某种通用位模式,generic bit pattern(例如,三个 20 位的整数,打包在一起)时,这种差异就会变得至关重要。

尽管 Lua 5.2 不支持整数,但整数还是以多种方式,潜入了语言。例如,用 C 语言实现的库函数,经常会得到整数参数。在这些地方,Lua 5.2 并未说明如何将浮点数,转换为整数:手册中只说了 “[该数] 会以某种非特定方式截断”。这并不是一个假设的问题;Lua 5.2 确实可以将 `-3.2` 转换为 `-3``-4`,具体取决于平台。而 Lua 5.3 则精确定义了这些转换,只有当数字具有精确整数表示时,才会进行转换。

Lua 5.2 未提供函数 `math.type`,是因为所有数字都有相同的子类型。Lua 5.2 没有提供常量 `math.maxinteger``math.mininteger`,因为他没有整数。Lua 5.2 也不提供下限除法(底除),floor division,尽管他是可以。(毕竟,他的求模 `modulo` 运算符,已经用下限除法(底除)定义了)。

令人惊讶的是,与引入整数有关的主要问题,是 Lua 如何将数字转换为字符串。Lua 5.2 会将任何整数值,格式化为整数,不带小数点。Lua 5.3 将所有浮点数,格式化为浮点数,要么带小数点,要么带指数。因此,Lua 5.2 会将 `3.0`,格式化为 `"3"`,而 Lua 5.3 则会将其格式化为 `"3.0"`。虽然 Lua 从未规定如何在转换中格式化数字,但许多程序都依赖于以前的行为。我们可以通过在将数字转换为字符串时,使用显式格式来解决此类问题。不过,更常见的情况是,这个问题表明,在其他地方存在更深层次的缺陷,即整数在没有充分理由的情况下,变成了浮点数。(事实上,这正是 5.3 版新格式规则的主要动机。在程序中,整数值被表示为浮点数,通常是一种不好的味道。新格式规则暴露了这些问题)。


## 尾注
Expand All @@ -636,3 +641,48 @@ x^y^z <--> x^(y^z)
4. 正如我们将在 [“多重结果”](functions.md#多重结果) 一节中讨论的,Lua 中的一个函数可以返回多个值。

5. 位运算是 Lua 5.3 中的新特性。我们将在 [“位运算符”](bits_and_bytes.md#位运算符) 一节中讨论它们。


## 练习

练习 3.1: 下面哪些是有效数字?他们的值是多少?


```lua
.0e12 .e12 0x12 0xABFG 0xA FFFF 0xFFFFFFFF
0x 0x1P10 0.1e1 0x0.1p2
```

练习 3.2:解释下列结果:


```lua
> math.maxinteger * 2
-2
> math.mininteger * 2
0
> math.maxinteger * math.maxinteger
1
> math.mininteger * math.mininteger
0
```

(请记住,整数的算术运算总是会回绕。)


练习 3.3:下面的程序将打印什么?


```lua
for i = -10, 10 do
print(i, i % 3)
end
```

练习 3.4: 表达式 `2^3^4` 的结果是什么?`2^-3^4` 又如何?

练习 3.5:数 `12.7` 等于分数 `127/10`。你能把它表示成分母是 2 的幂的普通分数吗?数字 5.5 呢?

练习 3.6:给定直角圆锥的高,以及母线与轴线的夹角,请编写一个函数,来计算直角圆锥的体积。

练习 3.7:使用 `math.random`,编写一个函数,生成具有标准正态分布(高斯分布)的伪随机数。

0 comments on commit 33da272

Please sign in to comment.