用yacc编写的算术运算计算器_如何用纯机械实现乘除运算,这是个问题

本文介绍了19世纪末由奥托·施泰格尔发明的“百万富翁”计算器,它是世界上第一台能进行自动乘除运算的机械计算器。文章详细阐述了其组成结构、使用方法,尤其是乘法原理,揭示了其通过机械“九九乘法表”实现乘法运算的创新设计。
摘要由CSDN通过智能技术生成

485e995283b37327fd4e4fe8ce25f8a1.png

在步进计算器诞生之后的两百多年中,机械计算之曲始终在莱布尼茨定好的基调上演奏。不难发现,两百年中的制造工艺在不断进步,机器的可靠性也不断提高,而计算原理却始终没有改进。尽管各路“莱系”计算器都宣称具备四则运算的能力,其实乘除法的实现靠的是重复加减,使用者总是需要旋转多圈手柄,以“伪造”乘除运算的过程。严格来讲,“莱系”计算器都不是真正的四则计算器,他们只具备加减能力,因此常被称为加法机(adding machine)。

那么,还有没有靠机械结构实现自动乘除的可能呢?有的,而且不止一个人交出了答卷。

1834年,意大利人路易基·托尔基(Luigi Torchi)发明了世界上第一台按键式计算器,同时也是第一台可以直接进行乘法运算的计算器。可惜的是,有关这台机器的史料存世甚少。正经传世的四则计算器设计分别出自美国人埃德蒙·巴伯(Edmund Barbour)、西班牙人雷蒙·韦拉(Ramón Verea)和法国人莱昂·伯利(León Bollée)之手,他们先后于1872年、1878年和1889年取得发明专利。

而第一个让四则计算器走向市场的,是一位生活在德国慕尼黑的瑞士工程师奥托·施泰格尔(Otto Steiger)。他改进了莱昂·伯利的设计,并于1892年取得德国专利,随后在法国、瑞士、加拿大和美国也陆续取得了专利。在苏黎世工程师汉斯·W·埃格利(Hans W. Egli)的帮助下,1893年,机器开始量化生产,他们为它起了个霸气而吉利的名字——“百万富翁”(The Millionaire)。

组成结构

“百万富翁”乍看起来像“高配版”算术仪,它有着和算术仪一样的置数滑钮和计算手柄。

0bf9fbb7153ea00e5a87ece79459fbd9.png
百万富翁组成结构(原图来自维基百科)

“百万富翁”封装于木盒之中(少数型号是金属盒),打开盒盖可以看到,机身分上下两大部分,上半部分又分为左、中、右三块功能区。左上区域是一根小角度摆动的手柄,称为乘数手柄,其内部隐藏着机械乘法的奥秘;中上区域是与算术仪类似的置数滑钮(后续有少数型号改装为按键),底部是与之一一对应的示数窗口;右上区域为选择运算模式的滑钮(A、M、D、S分别对应加、乘、除、减)和计算手柄,在任何模式下,计算手柄都顺时针旋转(后续有部分型号用电动马达代替了计算手柄);下半部分是封装在机器内部的可动部分,主要显示计算结果和手柄旋转圈数,每次计算前都需将可动部分移至最右侧,并向右滑动清零滑钮对其实现清零,清零滑钮在弹簧的作用下会自动回到左侧。

使用方法

加法运算

  1. 模式选择为A。
  2. 通过置数滑钮置入被加数,旋转计算手柄,被加数就显示到了结果示数窗口。
  3. 通过置数滑钮置入加数,旋转计算手柄,加数就累加到了被加数上,此时结果示数窗口即为最终结果。

减法运算

减法的步骤与加法一样。

  1. 模式选择为S。
  2. 通过置数滑钮置入被减数,旋转计算手柄,被减数就显示到了结果示数窗口。
  3. 通过置数滑钮置入减数,旋转计算手柄,减数就从被减数上扣除,此时结果示数窗口即为最终结果。

乘法运算

“莱系”计算器在进行乘法运算时,需要分别计算被乘数与乘数每一位的部分积,“百万富翁”也是如此。所不同的是,前者在计算被乘数与乘数某一位的部分积时,该位数字是多少,计算手柄就要旋转多少圈,而“百万富翁”始终只需旋转1圈。以1024×128为例:

  1. 模式选择为M。
  2. 通过置数滑钮置入被乘数1024。
  3. 旋转乘数手柄,指向乘数128最高位上的数字1,旋转计算手柄,被乘数1024与乘数最高位1所产生的部分积102400便显示到结果示数窗口。同时,在计算手柄的旋转过程中,可动部分自动左移一位,以备累加下一步被乘数与乘数次高位的乘积。
  4. 旋转乘数手柄,指向乘数128次高位上的数字2,旋转计算手柄,被乘数1024与乘数次高位2所产生的部分积20480便累加结果示数上,示数为122880。可动部分自动左移一位。
  5. 以此类推,直至乘数个位——此例中,这一步已经到达。旋转乘数手柄,指向乘数128个位上的数字8,旋转计算手柄,被乘数1024与乘数个位8所产生的部分积8192便累加结果示数上,示数为131072,即1024×128的最终结果。

除法运算

以131072÷1024为例: 1. 模式选择为D。 2. 通过置数滑钮置入被除数131072,旋转计算手柄,131072进入结果示数窗口。 3. 通过置数滑钮置入除数1024。 4. 比照除数和被除数的高4位,通过心算估算商的最高位为1,将乘数手柄指向1。 5. 旋转计算手柄,如果估算准确,结果示数被扣去除数1024与商最高位1的部分积102400,示数余28672。如果估算偏高了,被除数不够扣,机器就会响铃警报;如果估算偏低了,使用者会在下一步估算时发现。同时,在计算手柄的旋转过程中,可动部分自动左移一位。 6. 比照除数和28672的高4位,估算商的次高位为2,将乘数手柄指向1。 7. 旋转计算手柄,结果示数被扣去除数1024与商次高位2的部分积20480,示数余8192。可动部分自动左移一位。 8. 以此类推,直至结果示数小于除数,此时的结果示数即为余数。此例中,商的下一位估算为8,余数为0,商即128。

可见,这一除法过程很大程度上依赖于使用者的心算,“百万富翁”仅作为一件辅助工具,帮助使用者快速验证自己的估算。考虑到部分用户心算能力有限,盒盖的内侧贴着一张1~9分别与1~99的乘积表,并附有两个可上下移动的读数游标。

乘法原理

从上文可知,在“百万富翁”支持的范围内,多位数与任何一位数的相乘都只需要旋转一圈计算手柄。你可能绞尽脑汁也想不到,这一过程的实现靠的不是计算,而是“查表”。机器内部,乘数手柄的下方,竟藏着一“张”纯机械的“九九乘法表”!

在一块竖直放置的底座上,固定着17片呈阶梯齿状的金属片,每片厚约2mm,片间缝隙约1.5mm。每片从上至下分为9阶,阶高4mm,阶长为4mm的整数倍,从短到长依次有0mm、4mm、……32mm和36mm等10种阶长,分别表示数字0~9。

e5f2b281f51a14ee3fcb960cdbd8e996.png
“百万富翁”中的“乘法表”装置(图片来自「The "Millionaire" Calculating Machine - Technical Description」)

为便于观察,我们暂时将金属片的间距拉大:

c1cb5e0e574e6169b2a85337601f5c19.png
片距放大之后的“乘法表”装置(图/S7)

由远及近,第1片从上至下9阶分别代表1和1~9的乘积;第2、3片共18阶从上至下分别代表2和1~9的乘积,其中第2片表示十位,第3片表示个位;以此类推,第16、17片上18阶分别代表9和1~9的乘积,其中第16片表示十位,第17片表示个位。各片上各阶的单位长度(即其所代表的数字)。

c0f1d20e40700b868a615035147dbeec.png

从理论上的完整性讲,第1片前面应该也有一片表示十位的金属片,只不过1和1~9的乘积都是个位数,这一片上所有阶长都是0,便自然被省去了。

由于乘法表是纵横等效的,这一装置从上至下可以分为9层,每层有17阶,第1层对应1~9和1的乘积,第2层对应1~9和2的乘积、……第9层对应1~9和9的乘积。乘数手柄在0~9之间摆动,其实是在上下提沉整个“乘法表”装置,以使其某一层与右侧的9根传动齿条对齐。

6d8b59029765ba523a0ab0e43b60e2ef.png
“乘法表”装置与传动齿条(原图/S7)

旋转计算手柄,“乘法表”装置会向右撞击,与齿条对齐的那一层便将各齿条往右推移一段距离,各齿条的位移距离取决于“乘法表”该层与其相对的阶的长度。乘数手柄指向0时,整个“乘法表”装置位于齿条所在的水平面以下,后续的撞击就无法推动齿条产生位移。

每个置数滑钮下方都连着一个小齿轮,置数时滑动滑钮,小齿轮就与某一根齿条啮合。齿条被撞击时,小齿轮便旋转与齿条位移距离相应的角度,这一角度通过一系列齿轮传动最终体现到结果示数轮上。

bf1c74b9b0c405077f12de3b23e1b7c9.png
从齿条位移到结果示数的齿轮传动结构(图片来自「The "Millionaire" Calculating Machine - Technical Description」)

旋转计算手柄一圈的过程中,共产生两次撞击,以下以乘数为2(即“乘法表”第2层与齿条对齐)作为示例呈现这一过程。

79df76c18508ed6fe840716ada220a57.png
“乘法表”第2层与齿条对齐的正视图(图/S7)

1. “乘法表”装置在水平面内平移至表示十位的8阶与第2~9根齿条一一对齐(如图2.57所示),向右撞击后向左恢复至原位;

46886cb3b9cd249ab869dfbfab16fdd0.png
“乘法表”十位阶与齿条对齐俯视图(原图/S7)

2. 由于“乘法表”第2层十位阶的单位长度依次为0、0、0、1、1、1、1、1,故在撞击中,前3根齿条没有碰触“乘法表”而不发生位移,后5根齿条则均右平移1个单位距离后,在弹簧的作用下向左恢复至原位;

9cdb3bf246cf82d633ecf5224af2487b.png
在“乘法表”第2层十位阶的撞击下,齿条的位移状态俯视图(图/S7)

3. 可动部分左移一位;

4. “乘法表”装置在水平面内平移至表示个位的9阶与9根齿条一一对齐,向右撞击后向左恢复至原位;

7e89c7b9d906c697433e4e59c2c9e454.png
“乘法表”个位阶与齿条对齐俯视图(图/S7)

5. 9根齿条依次向右平移2、4、6、8、0、2、4、6、8个单位距离后,在弹簧的作用下向左恢复至原位。

9ea154129230d73a6b6e84a5b5f04f09.png
在“乘法表”第2层个位阶的撞击下,齿条的位移状态俯视图(图/S7)

参考文献

  • Wikipedia. The Millionaire Calculator[EB/OL].
  • John Wolff. The "Millionaire" Calculating Machine - Technical Description[EB/OL].
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值