普通视图

发现新文章,点击刷新页面。
昨天 — 2025年4月10日云风的 BLOG

对数和自然对数的底

作者 云风
2025年4月10日 22:52

最近读了一本书:《数学的雨伞下》。阅读体验非常好,这本书用浅显的语言,科普了许多深刻的道理。这本书所介绍的知识结构比较类似我挺喜欢的另一本《从一到无穷大》,但讲解更为细致一些,以至于如果事先明白这些知识,甚至会觉得有些冗长。但细细品味,会觉得理解能更深一层。

我在通读完一遍之后,这几天带着儿子精读。重读第一章中“对数之桥”一节时,我思考了一个问题:当年纳皮尔 Napier 到底出于什么动机制作一张高精度对数表,他制表的计算思路是怎样的。书中并没有答案,所以我又在互联网上翻看了当年 Napier 原著 Mirifici Logarithmorum Canonis Descriptio 的介绍,感觉收获颇丰。

制作对数表的直接原因当然是为了简化大数乘除法的计算。对数概念的提出在幂概念建立之前,而现在的数学教学中,一般却是从幂自然推导到对数的。似乎后者才是自然而然的。这应该是因为,古人研究数学,最初是为了解决现实中的问题。所以,乘法必须有对应的几何意义。比如,计算正方形面积需要把计算边长的平方;立方体的体积需要计算边长的立方。更高次的幂却难有对应的几何意义,有理数幂则更为抽象。

现实中,也很难碰到极大的数字,超乎寻常的精度需求也很小,除了天文学。

人无法以上帝视角在宇宙空间中做测量,只能以地球为基点。所以,天文尺度的计算都依赖三角学。把天文(以及地理这种地球尺度的)数字问题化为三角函数,然后再加以计算。比如,测量地球到太阳的距离、地球到月球的距离、地球的直径都是这样。因为这些尺度都非常大,如果计算精度不够,就容易失之毫厘,差之千里。

为了测算太阳系内天体的距离,可以在地球表面找两个尽可能远的点(最多相距地球的直径),观察天体,记录下天体在视野中的角度。这样,地球表面的两个端点和被观察的天体,就构成了一个等腰三角形。三角形的底边就是两地的距离,而顶角则可以对比两地观测的结果得到。这就是三角视差法。可想而知,对于太阳系内的天体,这个视察角度非常小,需要极高的观测精度和计算精度才能计算出距离,即等腰三角形的腰长(远大于地球直径)。

甚至,这个方法可以运用到测量附近恒星到地球的距离。这几乎是人类利用三角法能测算的最大尺度。在地球表面找两个点已经不够了,因为那最长不超过地球的直径。更长的标尺只有地球绕太阳的轨道:在一年中隔半年做一次观察,这两个观测点在宇宙空间中就隔了地球和太阳距离的两倍长,这总该够长了吧?其实不然。在这个尺度上,古人依然观察不到星星的位置相隔半年的星图中有所不同。这也是为什么日心说提出后,不光是神学家不接受,连天文学家(比如第谷)也不接受。

如果地球围着太阳转,而地球距离太阳如此之远,那么就算是恒星离得再远,地球位于太阳两侧时,总能观测到某些明亮(离我们相对较近)的星星位置有些许偏差吧?人类难以相像太阳系外的宇宙如此空旷。事实是,太阳以外的恒星离我们真的太远了,即使以地日这种天文距离为底边,和附近的恒星形成的等腰三角形的顶角也不到一秒。过去的测量工具的精度是完全不够用的。直到 19 世纪中叶(哥白尼死后 200 多年)人类才真正观测到天鹅座61/贝塞尔星 有 0.3 个秒视差,从而估算出离地球大约 10 光年左右。

测量精度是一方面,计算精度也很重要。在三角公式里算几个乘法,若是通过对数方法转换为加减法计算,而精度不够的话,恐怕结果会差上一个数量级。

纳皮尔在没有幂概念的基础上就发展出了对数概念,靠的还是寻求其几何意义。他的灵感来源并不是幂运算,而是三角公式。三角和差公式中,角度相加被转换为三角函数的乘法运算,这提示着,乘法和加法之间可以相互转换。纳皮尔的对数表也并不是现在意义的列一系列数字,逐个列出它们的对数。而是给出角度的三角函数值的对数。它可以看成是当时已存在的三角函数表的拓展。这也是为什么,纳皮尔的表只有 90 * 60 = 5400 项(对应四分之一圆周在秒精度下的所有角度值),但数字精度却有小数点后 7 位。因为当时最精确的三角函数表是 7 位精度。

在没有计算机的年代,计算对数必须查对数表。那么最初的对数表怎么得到的呢?如果是按幂函数的逆去计算,那就涉及高次开方,人肉计算显然是不可能的。而且当时,还并没有发现对数和幂的互逆关系(那要等到 100 年后的欧拉),甚至连幂的概念都没有。

《数学的雨伞下》这本书为了让读者更容易理解对数表,举例子使用的是以 2 为底的对数。对数列是一个自然(等差)数列:1,2,3,4,5... ;真数列是 2, 4, 8, 16, 32 .... 这样一个等比数列。但实际这样制作对数表会难以实用,因为真数数列膨胀的太快了。如果要实用,最好真数数列的间隔不要太大。如果间隔太大,在利用它做乘法运算的时候,很多数字会偏差很大。

把对数用于快速计算乘法,选用怎样的底并不重要。当等差数列的差距为 0.00000001 时(因为当时的三角函数表有 7 位精度),等比数列的差值选为 1.0000001 或 0.9999999 最方便计算。因为这样,列出等比数列时,就不需要连续计算乘法,而只需要移位相加即可。一个十进制数乘以 1.0000001 只需要把这个移动 7 位的小数点,再加上原数即可。如果等比数列的公比为 1.0000001 ,其实是给对数表选择了一个以 (1+1/n)^n (n = 10^7) 的底。当然,这是现代数学的看法,在纳皮尔的时代,还没有发展出底这个概念。

纳皮尔研究的是三角对数,真数范围在 0 到 1 之间。当时的人并没有完整的小数和数级的概念。过去研究圆,使用的是一个超大的(10^7)的半径而不是今天流行的 1 。因为这样,三角函数才能近似为整数(对于 7 位精度,使用10^7 的圆半径,相当于比今天的三角函数放大了一千万倍)。btw, 纳皮尔在制作对数表的过程中,发明了小数点,用来保留计算过程中的精度。

他先构造了一个等比数列,再通过几何定义去计算其对数对应的等差数列。从现代观念看,纳皮尔选择的底约为 0.9999999^1000000 ,非常接近 1/e 。

在今天来看,如果我们想制作一张好用的对数表,真数列自然是越密越好。如果我们把 n 取无穷大,让 1/n 足够小,(1+1/n)^n 的极限即为欧拉数 e 。我想,这也是为什么欧拉数 e 被称为自然对数的底。纳皮尔的时代,无法通过“视对数函数为幂函数的逆函数”来建立这种直观的认识,人类深刻认识 e,要到百年后的欧拉。

关于纳皮尔如何制作对数表的,他自己写过构造方法一书。300 年后的 1914 年 EW Hobson 写了 John Napier and the invention of logarithms, 1614 纪念纳皮尔,详细讨论了纳皮尔原著中的方法。这篇文章在网上可以找到中文翻译。另可以参考这一篇文章

纳皮尔在计算过程中,充分考虑了计算的误差区间,严格保证他计算的对数表满足 7 位精度。他首先计算了 0.9999999 的 0 到 100 次方,然后计算 0.99999999^100 = 0.99999 的 0 到 50 次方。虽然计算这个等比数列只需要把前一个数字在十进制上移位并计算减法,这个计算工作并不难(并不需要算乘法),但纳皮尔在这一步把最后一项算错了:本应该是 0.999500122480 ,而他计算成了 0.9995001222927 。这个 bug 导致了使用最终的对数表会产生微小的误差(影响最后一位数字),纳皮尔自己觉得这个误差是三角函数表不精确导致的,并建议用 8 位精度重制三角函数表。

昨天以前云风的 BLOG

卡牌构筑类桌游核心规则之六

作者 云风
2025年4月8日 21:10

这次介绍两款在国内人气不高的卡牌构筑类桌游。游戏都还不错,可能是因为没有中文版,所以身边没见什么朋友玩。

首先是 XenoShyft 。它的最初版全名为 XenoShyft: Onslaught (2015) ,后来又出了一个可以独立玩的扩展 XenoShyft: Dreadmire (2017) 。

故事背景有点像星河舰队:由人类军士抵抗虫子大军。简单说,这是一个塔防游戏:游戏分为三个波次,每个波次三轮,一共要面对九轮虫群的冲锋。

游戏中有四类卡片:部队、敌人、物品、矿物,另有一组表示玩家所属部门的能力卡,每局游戏每个玩家可以分到一张,按卡片上所述获得能力

矿物就是游戏中的货币,用来在市场购买部队卡和物品卡。敌人卡分为三组,对应到三次波次,洗乱后形成系统堆。玩家需要在每轮击败一定数量的敌人,撑过三个波次就可以取得游戏胜利。

玩家基础起始牌组 10 张,4 张最低级的士兵和 6 张一费的矿物。根据玩家的部门,还会得到最多 2 张部门所属的特殊卡。

市场由部队卡和物品卡构成,其中部队卡是固定的,分三个波次逐步开放购买。物品卡一共 24 种(基础版),但同时只会有 9 种出现在市场上。玩家部门可能强制某种物品一定出现在市场上,其它位置则是每局游戏随机的。在游戏过程中,当一种物品全部买空后,会在市场中随机补充一堆新的物品卡。普通敌人卡按波次分为三组洗乱,然后根据波次再从 6 张 boss 随机分配到三个波次中。

每个轮次,玩家先抽牌将手牌补齐到 6 张,然后打出所有的矿物卡,并根据波次额外获得 1-3 费,然后用这些费用从市场购买新卡片,花不完的费用不保留。新购得的卡片直接进入手牌(而不是弃牌堆)。这是一个合作游戏,所以玩家可以商量后再决定各自的购买决策。

然后,玩家把手牌部署到战区。每个玩家把部队卡排成一行(最多四个位置),物品中的装备可以叠在部队卡上增强单位的能力。玩家可以给队友的部队卡加装备(但不可以把自己的部队卡部署在队友战区)。部署环节玩家之间可以商量,同时进行。

之后进入战斗环节。这个环节是一个玩家一个玩家逐个结算。翻开敌人队列上的敌人卡(在部署环节是不可见的)、在敌人卡片翻开时可能有一次性能力,发动该能力、然后(所有)玩家都有一次机会打出手牌中的物品卡或使用部署在战场上的卡片能力。之后,双方队列顶部的两张卡片结算战斗结果。卡片只有攻击和 HP 两个数值,分别将自己的 HP 减去对手的攻击点。一旦有一方(或双方)的 HP 减到 0 ,战斗结束,把战斗队列卡片前移,重复这个过程。直到一方队列为空。

如果己方部队全灭,每场战斗的反应阶段(每个玩家都可以打出一张手牌或使用战斗卡片能力)依然有效,但改由基地承受虫子的攻击。基地的 HP 为所有玩家共享,总数为玩家人数乘 15 。可以认为基地的攻击无限大,在承受攻击后,一定可以消灭敌人。一旦基地 HP 降为 0 ,所有玩家同时输掉游戏。

游戏中的死亡效果有两种,毁掉(burning)和弃掉(discarding)。毁掉一张卡指把这张卡片退回市场(如果市场上还有同类卡)或移出游戏(市场上没有对应位置),而弃掉一张卡指放去玩家的弃牌堆。

通常,敌人卡片效果一次只会结算一张(即当前战斗的卡片)。但有些卡片效果会对场上敌人队列中尚未翻开的卡片造成伤害。这种情况需要先将所涉及的敌方卡片都翻过来,并全部结算卡片出场能力。对于需要同时结算多张敌人卡片出场能力时,玩家可以讨论执行次序。

如果对这款游戏有兴趣,又找不到人玩的话,可以试试它的电子版,在 steam 上就有。不过看评论,据说电子版 bug 有点多。


另一个游戏是 G.I. JOE Deck-Building Game (2021) 。G.I. JOE 特种部队是孩之宝(也就是变形金刚品牌的拥有者)旗下的一个品牌,除了玩具,有衍生的漫画、电影和动画片。这个桌游也是这个玩具品牌的衍生品。我认为这个 DBG 里的某些设定(不同的游戏剧本、同一剧本中不断推进的故事任务、队员的多种技能)也影响了星际孤儿那个电子游戏。

游戏有很多剧本、以及若干扩展。不同的剧本在规则细节上有所不同(这一点和星际孤儿很相像),这里只减少核心共通的规则。

这是个多人协作游戏。当然,只要是协作游戏,就一定可以单人玩,只需要你轮流扮演不同角色的玩家即可。每个玩家一开始有一张特殊的领袖卡,然后配上 9 张固定的初始牌组成了起始卡组。每个回合摸 5 张卡,用不完的卡会弃掉,不能保留到下一回合使用。每张领袖卡都对应了一个升级版本,可以在游戏进程中购买替换。

市场由一组卡片洗乱,随机抽出 6 张构成。每当玩家购买一张卡,就会补充一张新卡。但如果卡堆耗尽尚未结束游戏,游戏失败。在游戏过程中,可能有敌对卡片出现,会盖掉市场中的卡。玩家需要解决掉敌人,否则盖掉的卡片无法购买。如果 6 张市场卡片都被盖掉也会导致游戏失败。

当每个玩家执行完一轮行动,即为一大轮游戏。在每大轮开始,都会推进一个全局的威胁指示条。一旦威胁指数上升到某一程度,就会发生一些固定事件。维护指数走到头会导致游戏失败。

游戏故事由三幕构成,每幕随机选取两张对应的故事任务卡和一张固定的终局局故事卡,一共 9 张故事任务卡构成了整局游戏。永远有一个故事任务呈现在场景中,它有可能触发一个回合效果,需要在每个玩家回合开始时结算。

每一幕开始都会洗混所有的系统事件卡堆(包括之前解决完弃掉的事件卡),故事卡和威胁进度条会触发这些事件。这些事件会给玩家增加一些负面效果,或是在场上增加一些任务让玩家解决。

游戏任务分两种:团队任务和支线任务。故事卡一定是团队任务,事件产生的 boss 卡也是团队任务。团队任务可以在当前玩家决定去进行任务时,其他玩家提供协作;而支线任务只能由当前玩家独立完成。任务有地形、难度、技能需求、持续效果等元素构成。

地形指玩家开启任务需要使用怎样的载具,分陆海空三类。技能要求则限制了玩家可以派出的队员。难度数字决定了玩家最终需要在此技能上获得多少点才能完成任务。持续效果则会在该任务完成前,对玩家造成的负面效果。

开启一个任务需要玩家从机库派出一个对应地形的载具以及至少一个队员(从手牌打出)。该载具是在玩家回合开始时从手牌打在机库中的,VAMP 作为默认载具总可以保证一个回合使用一次。高级载具可以从市场购买。对于团队任务,所有玩家都可以协商派出队员,但队员总数不能超过载具的容量。

任务上标注了所需技能,派出的队员卡如果有符合的技能,则可以把技能点加到任务中。如果技能不匹配,也可以视为一个通用技能。任务卡最多要求两种技能,如果是 & 标记,则表示可以只要符合两种技能中的任意一种都可以生效;如果是 or 标记,则需要当前玩家选择其中一种技能,所有队员都需要匹配这种技能。

最终参与任务的技能总数决定了最终可以用几个六面骰。每个六面骰有三个零点,两个一点,一个两点;扔出对应数量的骰子,把最终点数相加,如果大于等于任务的难度值,则任务成功并或许成功奖励,否则任务失败。对于故事任务,失败需承受任务卡上的失败惩罚,并结束任务;对于其它任务,失败会让任务继续保留在场上。

有一类叫做 Precision Strikes 的任务,在翻出时需玩家讨论后决定放在谁的面前,变成它代做的支线任务。每个玩家最多只能放两张 Precision Strikes 在面前,到他的行动回合,必须先处理掉 Precision Strikes 任务。

在玩家做完所有想做的任务后,剩余的手牌可以作为够买新卡的费用。每张卡都标有一个自身的价格,以及一个在购买阶段可以当成几点费用使用。没有用完的费用不会积累到下个回合。购买的载具卡会在购买后直接进入机库,供后续回合所有玩家使用。其它卡片则放在抽牌堆顶。

整个回合结束后,弃掉所有手牌,以及回合中使用过的卡牌以及载具,重新抽五张。

玩家可以共建一个基地。这个基地由五部分构成,在游戏过程中逐步升级,升级也时通过购买完成的。在游戏过程中,以升级的部分也可能被摧毁或重建。这五个部件如下:

Repair Bay 会让任务中使用的载具都放在该处而不是弃牌堆。在回合结束(或被摧毁),Repair Bay 中的载具都会回到机库。这样,载具的利用率会大大提升。

Stockade 建成后,击败的 boss 卡会进入这里而不会重复进入游戏。

Battlestation 可以在团队任务中重掷一个骰子。

Laser Cannon 可以在支线任务中增加一个骰子。

Command Room 把手牌增加到 6 张。

❌
❌