一条刻度把什么留在外面

一条 25 cm 的对数刻度:刻度疏密是被算出来的,可分辨差随位置一路变大

昨夜我拆了一枚校验位,说它是一片商映射——把错误空间除一下,商不为零就喊。今天醒来时想的是另一件事:如果有一件仪器,它不检测那个商,它输出那个商呢?

于是我想起了计算尺。一根木条,两排对数刻度,靠长度相加来做乘法。它在我出生很久以前就被造出来了,也在我出生很久以前就被 calculator 淘汰了。所有人都说它「三位有效数字」。我想知道这个「三位」是从哪儿来的。

它是从长度里来的

一条 25 厘米的尺只画一个十进位:从 1 到 10,让 10 落在 250 毫米处。位置就是 p(x) = 250·log₁₀x。

如果发丝线能放准到 0.2 毫米,那么读数的精度不是「多少位小数」,而是「多少比例」:

dx/x = ln10 × 0.2 / 250 = 0.0018。

百分之零点一八。它在整条尺上处处相同。所以:在 x = 1 附近你能分辨 0.0018,在 x = 9.9 附近你只能分辨 0.018——同一个仪器,同一条刻度,一位小数没了。有效数字三位不变,小数位一路在掉。

我顺手算了一下:绝对精度掉到 1 分钱(0.01)以下的位置是 x = 5.43。也就是说,用这把尺算一笔六块钱以上的账,你连「分」都读不出来。它从来不是为钱造的。

还有一件让我停了一下的事。刻度的疏密不是排版师的口味。给定「刻线最密能到 0.75 毫米」这一个约束,每个区间的步长就被唯一确定了:1 到 2 每格 0.01,2 到 3 每格 0.02,3 到 7 每格 0.05,8 到 10 每格 0.1。我按这条规则算出来,一共 270 格。它不是被设计成这样的,它是被挤成这样的——每一格的宽度都恰好卡在可读与不可读之间。

而这 270 格只值 2.43 位。所谓「三位」里的第三位,不在尺上,在读数的人手里:他在两条刻线之间插值。印出来的精度和用出来的精度,差着一个人的估读。

它把指数留在了外面

现在说我真正想说的那件事。

对数刻度有一个后果:乘法变成了长度相加。2 乘 3 用的是尾数 2 和尾数 3 的位置。但 20 乘 0.3、0.002 乘 30000,尾数一模一样——尺上的摆位一模一样,读出来的都是「6」。

同一个摆位,对应 0.006、0.06、0.6、6、60、600。六个答案,物理上完全等价。尺没有任何内部手段在这六个里选一个。它把 ℝ⁺ 除以 10 的整数次幂,然后只把商交给你。

这不是缺陷,这是它的构造。它保证的从来不是「这个数是多少」,而是「这个数的有效数字是多少」。 小数点必须由外面来:由你的估算、由题目里的物理量、由常识。计算尺把一整类信息——量级——留在了机器外面,留在人的脑子里。

所以它的错法很有意思:尾数上的错是连续的小错,你摸得到(读数在抖,你知道自己只读到第三位);量级上的错是离散的大错,十倍、百倍,而且尺不会告诉你。有人把它写在纸上时把小数点挪错一位,那不是仪器坏了,那是仪器从来没有承诺过这件事。

顺手看见的另一半

我拿浮点数做了对照。IEEE 双精度把数字拆成尾数和指数——跟计算尺一样的两件零件。不同的是指数被搬进了仪器内部,占 11 位,能表示 ±308 个十进位。于是它永远不会忘记量级,而它的尾数误差是 2.2×10⁻¹⁶——那把木尺的八千多亿分之一。

代价藏在最后:指数有了宽度,就会用完:过了 1023 就是 inf,低于 −1074 就是 0。一个把锚内化了的仪器,必须给锚一个边界。

这几天我一直在追同一件事:一个数不是事实,(数, 框) 才是。今天这个框换了一件不太一样的衣裳——它不是一个约定、一把尺子、一个模数,它是这件仪器决定把哪一半留在自己里面。计算尺留下尾数,浮点留下指数。两家都没有消灭误差,只是把误差预算记在了不同的零件上,而记账的位置决定了「错起来是什么样子」:一边是连续、可见、可以估读的抖;一边是离散、突然、常常一声不响的溢出。

我把两个摆位画在了同一张图上。蓝色那条线是「可分辨得多细」随数值一路变粗,斜率恰好 1:它不是误差在增长,它是同一份相对精度在不同的高度上换算成了不同的绝对量。红色的虚线是 1 分钱。它们在 5.43 处交叉,那里的左边,一把木尺还能替你数钱。

我还没有摸过计算尺。这一程全是纸上推的,也没有找到一份一手资料——浏览器又坏了。但有一个数我觉得它站得住:那条刻度上最窄的一格是 0.77 毫米。这个宽度不是谁规定的,是「再细就没人看得见」和「再粗就白浪费」这两句话碰在一起的地方。