从整个人类的发展史上看,我们的科技和生产力是以加速度的规律发展的。尤其是最近的一百多年时间里,我们的加速度得到了前所未有的提升。在70万年以前,周口店的“北京人”就已经会使用火了。在大约10万年前,还是这片区域,山顶洞人已经能够制作一些石器和装饰品。在1953年西安的半坡村发现了一处古代母系氏族的遗址,其距今为5600~6700年。从出土的陶器上发现了22种可能是用来计数的符号。

牛顿在300多年前提出的牛顿力学依然是我们现在解释宏观世界物理现象的基础理论。随着《自然哲学之数学原理》的出版,开启了现代科学飞速发展的时代。1873年的麦克斯韦发表了《电磁论》一书,奠定了完整的电磁理论才不多100多年。技术的飞速发展还体现在了我们现在强大的运算能力。

艾萨克·牛顿

我们先来思考这样一个问题,从人类出现在地球上开始,直到现在,整个人类史进行了多少次算术运算?(算术运算指的是加、减、乘、除、开平方、开立方、求三角函数、解微分方程等。)当然,谁都不能统计出精确的值,我们只需要算出一个估算值即可。

我们在古埃及发现了公元前3000~前2500年的象形数码,而我国的甲骨文中也出现过数字符号,这迄今为止也至少有4000年的岁月。所以我们可以认为人类进行算术运算的历史不超过5000年。

殷墟发现的甲骨文

假设每个人每天会进行100次算术运算,那么每个人每年就会计算36500次。那么我们需要计算全球的人数,全球的人数在过去的几千年里由于技术原因和战争原因,一直缓慢增长,直到最近200年,数量上才突飞猛进的。在1804年全球人口总数才打到10亿,到现在已经发展到了70亿人口。我们可以认为5000年以来,平均每天会有0.5亿人进行算术运算。我们不难得出:5000*365*100*0.5*10^8=10^16

天河一号超级计算机

我们得出的这个估算值应该比实际值大很多,虽然它看起来是一个很大的数。但是跟现代科学遇到的大数相比简直不值得一提。这个数只能估算到1943年,因为电子计算机的出现,使人类的计算能力有了一次质变,现在我们一秒钟的计算次数就远远超过了10^16次。

曼哈顿计划和卡片计算机

1939年爱因斯坦写信给当时的美国总统罗斯福,他建议罗斯福重视原子武器的研究工作。随后罗斯福拨款6000美元,“曼哈顿计划”从此正式开展。曼哈顿计划集合了当时世界上最优秀的一批数学家、物理学奖和工程师。在前期理论计算工作中,他们估算出他们所面临的计算量要比人类有史以来全部的计算量还要多。这使得他们的研究陷入了困境,直到他们想起了IBM公司生产的卡片计算机。

参与“曼哈顿计划”的部分科学家

19世纪50年代之后,美国的外来移民数量大幅增长,需要每10年做一次人口普查。1880年人口普查的数据,人工处理了7年,也就是直到1887年才得出结果。而1890年又会进行一次新的人口普查,这时人们意识到,随着人口的增加,也许这次直到1900年也未必会处理完1890年统计的数据。在这种情况下,纽约州布法罗城的统计员赫勒里斯发明了卡片计算机。虽然1890年的人口数量比1880年时多了1200万,但借助于卡片计算机,仅仅用了两年多就处理完毕了。

穿孔卡

卡片计算机是一种复杂的电机械设备。它与现在的计算机不同,它只能执行“固定程序”的计算。使用它之前需要将需要计算的数据穿在卡片上,效率低下。经过多次改进,后来形成了“卡片程序计算机”,这时它能运行“外部程序”了,它不仅能把数据穿在卡片上,还能把“程序”也穿在卡片上。

其实我们身边有很多种外部程序控制的机器设备。例如,用来编织各种纺织物的机器。它们通过穿孔纸带上不同的数据,编织出不同图案的纺织物。

由于卡片机的使用成本比较高,通常IBM公司会给租用卡片机的客户配备技术人员,协助安装与调试,使其能够正常工作。当时曼哈顿计划的领导人向IBM公司租用了一台卡片计算机,并从欧洲调回了一位合乎保密要求的技术人员来调试该机器。但是当这位技术人员千里迢迢赶到机房时吃惊的发现,这台使用复杂的机器已经正常运转起来了。原来是几位年轻的理论物理学家,包括后来得了诺贝尔奖的理查德·费曼,已经根据说明书自己动手开箱安装完成了。其中有几位年轻的物理学家对这台机器产生了浓厚的兴趣,他们为后来计算物理学的发展做出了巨大的贡献。

理查德·费曼

卡片计算机能够在7秒内完成一次乘法。以这个速度应对曼哈顿计划还是太慢了,所以只能同时使用大量的计算设备。数学家冯·诺依曼也参与了曼哈顿计划,他看到了用数值方法解决重大实际问题的前景,但是速度却有限,他极度迫切的想要提高当时的计算速度。要想提高计算速度,首先要明确是什么限制了当时的计算速度。

影响计算速度的原因

人类也做过多次手工计算大规模数据的工作,比如大地三角测量和天文测量数据的处理。大数学家高斯花费了10年时间去完成汉诺威王国的大地测量,他曾用几天时间求解一个包含55个未知数和300个条件方程的最小二乘法计算。如果测量更广大的区域,那么未知数和条件方程就会更多,使计算的时间变的越来越长。

数学王子——高斯

这种情况下,数学家通常会把这些重复但是耗时的计算交给一批计算员去做。计算员的工作分为以下几个步骤:

  1. 首先设计一张纵横表,它反映出每一步基本运算的过程和得出最终结果的顺序,以及保证结果的检验方法。
  2. 然后把数据填入表中列和行的相应位置上。
  3. 按照行和列依次计算结果。例如:把第一行的每个数求余弦填入第三行,把第二行的每个数求立方填入第四行,再把第三行的每个数除以第四行相应的数填入第五行,等等类似的操作。

人们总结出了大规模结算过程中的大致流程。

  1. 要有一张表格记录着原始数据、计算过程中的数据和计算的结果。它起到了“存储器”的作用,也记录了计算过程。
  2. 具体的两个数的求值过程,比如上个例子中两个数相除可以用算盘和手摇计算器。这些工具就是“运算器”。
  3. 上例中计算员在计算求余弦和立方时要查阅相关的数学用表,例如《巴罗表》。这其实是一种数据库,它保存着已经计算的大量数据,不用重复计算,结果直接查表可得,提高效率。
  4. 计算员的执行步骤,他从表中读取数据,经过2、3步后将结果写入表格的相应位置,计算员充当起了“中央控制器”的作用。

手摇计算器

从这些流程可以看出,要想提高计算速度,就要提高每一步骤的速度。仅仅提高一个步骤的速度,效果甚微。比如把算盘或者手摇计算器换成当今的电子计算器,虽然完成求余弦和立方的计算时间大大缩短了,但整个计算过程还是很慢。这个问题还存在今天的计算机,现在的计算机CPU的计算速度远远快于内存的读写速度。要想提高所有流程的速度,首先就要实现自动的逻辑控制。否则每一步骤的速度很快,但是每个步骤间的流程控制很慢也是于事无补的。所以我们要做到一旦计算开始,就要避开一切人为干预,直到自动运算出最终结果。

数的进制和存储

既然要做到机器全部自动运算,那么首先要解决的问题就是如何用机械或者电气元件来保存数据。

我们在小时候学习计数时,都是掰着手指进行计数,所以熟练使用十进制已经深深刻在了我们的脑海里。其实还存在一种更简单直接的进制,那就是反映“有无”、“正负”、“高低”、“真假”这种关系的二进制。二进制是一种简单的方式,因为任何一个具有两种状态的物理过程,都可以用“有”和“无”,或者1和0来表示。把1和0组合起来可以表示我们熟知10进制的任何数。例如,从0到16的十进制数用二进制写出来就是:

0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000

二进制是很容易理解的数制,十进制乘法里的“九九表”,在二进制中只剩下“一零得零,一一得一”两句口诀。

二进制在一个位置上用0和1两个符号实现0和1两个数。如果在两个位置上各用0和1两个符号实现0,1,2,3四个数,就构成了四进制。八进制则用三位二进制数,实现0,1,2,3,4,5,6,7八个数。同理,用四位二进制可以实现十六进制,不过这时普通的数码不够用了,要以A,B,C,D,E,F来分别代表10,11,12,13,14,15。

二进制:10000=2^4=16

四进制:10000=4^4=256

八进制:10000=8^4=4096

十六进制:10000=16^4=65536

任何进制都可以翻译成十进制,例如

10201=10000+2*100+1=3^4+2*3^2+1=100

最早用二进制组合出四进制和八进制的记载,应当认为是我国传说中的“伏羲八卦图”。伏羲用“—”和“--”两种符号拼成了八卦。

伏羲八卦图

这么多进制方式,我们应该选取哪种方式呢?用三位十进制能表示数的个数是10^3-1=999,而用三位二进制能表示111=2^3-1=7个数字。同理,用n位k进制能表达数字的个数是:k^n-1

假设每一位上的k进制数码0,1,2,3···k-1都各要用一个“状态”来实现,而且n位k进制寄存器的成本c正比于状态的总数kn。要求以成本c=kn最小,而所能表示数字最多个数=k^n-1=为指定常数,来确定k的值。这是带一个“约束条件”的优化问题,它很容易求解。把成本对k微分,应有

再对约束条件微分,求得

代入前面的式子,得到决定k的关系式

即k等于自然对数的底e=2.71828··· 最接近e的整数是3,于是三进制应该是最优选择。但是具有三个状态的元件必须专门设计,能给出两个状态的物理效应比比皆是。2是最接近e的另一个整数,这是使用二进制是另一个大理由。

现在二进制广泛应用在我们身边的各种计算机中,可以说现在我们的世界一秒钟都不能离开对二进制的依赖。正是二进制的高效,才会有今天更加强大的计算能力。

(部分图片来源于网络,如有侵权请及时联系删除)

在quartusii如何设计出一个 3 位的十进制加法计数器的原理以及它的设计电_从算盘到计算机,从十进制到二进制,人类计算能力的提升...相关推荐

  1. 如何设计出一个有灵魂的「签到功能」?

    本文为PMCAFF专栏作者迷路的威廉出品 提到签到功能,想必是个人都并不陌生,有些人对它可能嗤之以鼻,不屑于去签到,有些人则可能是乐此不疲,深深陷入其中. 说实话,签到确实是一种基础功能,有的PD认为 ...

  2. 平面设计零基础怎么设计出一个完美的名片

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 平面设计零基础怎么设计出一个完美的名片?每个人都会有专属的名片,好的名片可以让你的商业精英形象愈发生动起来.今天,为 ...

  3. 怎样设计出一个起飞的Token

    怎样设计出一个起飞的Token ==最近发现网络上一篇不错的文章,故转载以便更多的人可以看到= 不久前,我在在前后端分离实践中提到了基于 Token 的认证,现在我们稍稍深入一些. 通常情况下,我们在 ...

  4. 怎么设计出一个简约艺术感海报?这个PS设计教程很详细!

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 怎么设计出一个简约艺术感海报?这个PS设计教程很详细!今天兔课菌教大家使用PS快速制作简约艺术感海报,看上去非常有艺 ...

  5. python四瓣花图形_如何使用Inscape设计工具设计出一个四瓣花朵图

    在使用矢量图形时,利用Inscape设计工具绘制多个圆形,并利用圆形的特性设计出一个四瓣图形,然后使用图形的形态交叉光滑效果,形成一个花瓣图形.下面利用一个实例说明,操作如下: 工具/原料 Insca ...

  6. css3魔方3乘3每层旋转_如何使用css3设计出一个立体旋转魔方?

    需要先了解的知识: ①了解CSS的2d下的transform变化下的平移(translate)和旋转(rotate). ②了解CSS的3d下的transform变化下的平移和旋转. ③使用transf ...

  7. 软件体系结构设计文档_一个java架构师是如何设计出一个好的架构的

    一.架构的定义 所谓一千个架构师中有一千种"最好的架构"模式. "架构"是我们行业中非常普遍的词,表示它也必须是经过长时间磨合后形成的词. 架构一词的含义是什么 ...

  8. 如何才能设计出一个“好的”测试用例?

    1.21"好的"测试用例的定义 在正式开始讲解之前,先讲一下什么是"好的"测试用例,这个"好"又应该体现在哪些方面.这两个问题看似简单实则难 ...

  9. 产品经理必备知识之网页设计系列(二)-如何设计出一个优秀的界面

    前言 第一部分参见 产品经理必备知识之网页设计系列(一)-创建出色用户体验 https://blog.csdn.net/wenyusuran/article/details/108199875 第三部 ...

最新文章

  1. 使用OpenVINO ToolKit 实时推断
  2. 在RAC中重建EM(转)
  3. 在windows上模拟linux环境,MSYS2——Windows平台下模拟linux环境的搭建-Go语言中文社区...
  4. 细数黑客攻击的七大战术
  5. 数学建模亚太赛优秀论文_2019亚太地区大学生数学建模竞赛志愿者等级评定结果公布!...
  6. php+js实现异步图片上传,JavaScript实现异步图像上传功能
  7. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
  8. 新版中日交流标准日本语多媒体版(全25CD)下载
  9. [ExtJs6]随记--去除extjs trial水印
  10. 输入罗马数字1到12输出阿拉伯数字C语言,用C语言古罗马数字转化阿拉伯数字
  11. vue h5端实现富文本图片预览(基于 Vant 的 ImagePreview 组件)
  12. 【直击DTCC】宝存CEO阳学仕:闪存技术已经无法阻挡
  13. Mac搭建GO开发环境
  14. An adaptive gamma correction for image enhancement 低照度图像自适应gamma矫正
  15. 二代旅游CMS网站管理系统使用手册(二)--目的地管理
  16. 如何将MP4视频转换为MP3音频
  17. 35岁前要培养的66种思维(上)
  18. 敏捷开发产品管理系列之二:产品版本规划
  19. css布局入门级实战之九宫格网格布局
  20. RAID重组——利用VMware和取证大师来重组

热门文章

  1. 如何在参考文献中优雅地引用URL?How do you get nicely formatted URLs in the bibliography?
  2. nodejs后端使用art-template
  3. oracle切换sqlserver,ORACLE语法转换成sqlserver,该如何解决
  4. php mencache扩展,【memcache缓存专题(3)】PHP-memcache扩展的安装以及使用
  5. 用python可以解决什么问题_学 Python 能帮你解决什么问题 ?
  6. linux的QQ邮件告警,QQ邮箱告警注意点
  7. 2.Java 面试题整理(基础篇二)
  8. Storm案例:统计单词个数
  9. Spark案例:Scala版统计单词个数
  10. Python编程基础02:Python基本语法