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

组成结构

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

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

“百万富翁”封装于木盒之中(少数型号是金属盒),打开盒盖可以看到,机身分上下两大部分,上半部分又分为左、中、右三块功能区。左上区域是一根小角度摆动的手柄,称为乘数手柄,其内部隐藏着机械乘法的奥秘;中上区域是与算术仪类似的置数滑钮(后续有少数型号改装为按键),底部是与之一一对应的示数窗口;右上区域为选择运算模式的滑钮(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。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. 可动部分左移一位;

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

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

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

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

参考文献

  • Wikipedia. The Millionaire Calculator[EB/OL].
  • John Wolff. The "Millionaire" Calculating Machine - Technical Description[EB/OL].

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

  1. 用yacc编写的算术运算计算器_详细的mac计算器操作技巧+快捷键分享

    我们的mac自带的计算器并不只可以应用于简单的计算,还有很多强大的实用功能你知道吗?今天小编就来带你解锁这些计算器的新功能.并有快捷键奉上~ 使用"计算器"执行基本计算.高级计算或 ...

  2. 用yacc编写的算术运算计算器_10天学会四则运算小计算器设计之第5天

    写在前面的话 我大学本科学的是测控专业,2012年考取首都师范大学物理系研究生.我从未学习过数字电路设计,对FPGA和Verilog语言没有任何概念,更没有设计数字电路系统的基础和经验,也从未自己动手 ...

  3. 用yacc编写的算术运算计算器_Linux里隐藏的计算器,你知道它的奥秘吗?

    大家都知道,windows下有个计算器工具,我们在工作生活中经常使用到它.但是,你可知Linux下也同样有个计算器吗? 当然,良许说的是命令行下的计算器工具,而不是界面型的计算器.良许是Linux应用 ...

  4. python编写一个简单计算器_如何用Tkinter写个简单计算器

    上机实践课程开始了,嗯,老师来了之后念了下PPT,然后说:开始做吧......... 然后就开始了Python的GUI之路,以前没接触过PYthon的可视化界面(虽然这样很不明智) 但是现在做起来感觉 ...

  5. java编写大数据分析模型_如何用Java(DOM分析器)编写XML文件

    java编写大数据分析模型 Earlier we learned how to read XML file and how to edit XML file in java using DOM Par ...

  6. 用java编写的爱情红心_如何用java实现每天给对象发情话

    一.引言 最近看到一篇用js代码实现表白的文章,深有感触. 然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞 实现思路: 使用HttpClient远程获取彩虹屁 ...

  7. 用python编写程序判断奇偶_如何用python判断奇偶数

    问题分析:用Python编写一个程序,判断输入的数字是奇数还是偶数,并相应的输出信息,要判断一个数为奇数还是偶数,依据的是它被2除后的余数.因此可以用"%"运算符来计算并判断. 代 ...

  8. python web为什么不火_如何用纯 Python 写交互式 Web 应用?

    不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户. 痛点 从我开始折腾数据分析工具的那一天,就没有想明白一件事儿 -- 我打算把数 ...

  9. css 跳动的心_如何用纯CSS为您的情人打造一颗跳动的心

    css 跳动的心 Each year on February 14th, many people exchange cards, candies, gifts or flowers with thei ...

最新文章

  1. 提高sqlmap爆破效率
  2. 中科院分词系统(NLPIR)JAVA简易教程
  3. PHP制作回合制游戏,回合制游戏脚本制作采集思路
  4. oracle日志分析产品,鼎甲技术应用:Oracle日志分析 之事务级精准恢复
  5. 办公自动化系统开发实例导航 源码_本色世界源码搭建(系统开发)
  6. h5页面不可 移动_七大h5创建工具
  7. 日本老年人开始送外卖了 锻炼赚钱两不误 网友:饿死了么外卖?
  8. 81-spark异常总结1
  9. 微软推出 Xbox 漏洞奖励计划,最高奖励2万美元
  10. MCS51单片机的输入/输出接口
  11. 时间管理——永远做重要不紧急的事情
  12. 阿里CEO张勇:打破各企业边界 联手对抗黑灰产
  13. 友善串口助手使用教程_友善串口调试助手基本功能怎么使用-友善串口调试助手使用教程...
  14. shell编程-数组的使用
  15. 链乔教育在线|数字化工作管理工具—Notion(四):同步块(Synced block)
  16. set在python中是什么意思_python中set是什么意思
  17. 年中团建之军训-回顾
  18. BaseQuickAdapter设置条目点击事件无效
  19. 如何应对redis缓存的击穿、穿透和雪崩
  20. 【自然语言处理】【知识图谱】知识图谱表示学习(三):SE、SME、LFM、RESCAL、HOLE

热门文章

  1. 查看端口占用情况lsof,并关闭对应进程kill
  2. 提交form前先使用JS进行验证
  3. 网络流(最大流):CodeForces 499E Array and Operations
  4. 实用Redis操作类
  5. Centos7.0 Vmware10.0.3 网络桥接配置
  6. 没有用户的可用性测试
  7. linux日志auditd,linux 审计工具auditd日志audit.log时间戳转换查看
  8. mysql 两个结果集求差
  9. SQL Server2005创建新数据库时不允许创建新数据库的问题
  10. 7 练习1 -基础练习