为什么除法比乘法难?
来源:互联网 发布:网络贷款口子 编辑:程序博客网 时间:2024/06/11 20:58
http://www.guokr.com/question/445105/?page=1
为什么除法比乘法难?
比如说吧。
7.6*2.5=19 不管怎么看都要比 19/7.6=2.5 要简单。
而且程序上计算乘法比计算除法占的处理器也少,貌似是这样?
求解。
8人关注关注
90
支持者: BrainMaker Jokies we_cry 节南山之什 春水涣涣 更多
计算机组成原理里面有关于乘法和除法的算法的。首先它们算的都是二进制。然后计算机硬件实现的是加法、求非(求相反数)、移位(÷2、×2)
乘法的本质是加法,人的思维方式的这种乘法在计算机里叫做原码一位乘,
原码一位乘的过程是这样的:
10111*11001=
10111*
11011=
10111+
10111+
10111+
0+
10111+
10111
(果壳不要吞空格!求!)
对计算机来说,就是10111+10111*1,
然后10111左移一位,再加上去,再左移,不加,左移,加上去,左移,加上去得到最后得数。
要判断五次是否相加(是0就不加(废话))、加法不定次数、左移4次。
▲ 对两个正数来说,它们补码的乘积等于它们乘积的补码。若乘数是负数时,这种情况就不成立了。
原码乘法的主要问题是符号位不能参加运算,单独用一个异或门产生乘积的符号位。故自然提出能否让符号数字化后也参加乘法运算,补码乘法就可以实现符号位直接参加运算。
为了得到补码一位乘法的规律,先从补码和真值的转换公式开始讨论。(以纯小数为例)
1. 补码与真值的转换公式
设[x]补 = x0 . x1x2…xn,有:
n
x = - x0+∑ xi2-i
i=1
等式左边 x 为真值。此公式说明真值和补码之间的关系。
2. 补码的右移
正数右移一位,相当于乘1/2(即除2)。负数用补码表示时,右移一位也相当于乘1/2。因此,在补码运算的机器中,一个数不论其正负,连同符号位向右移一位(即符号扩展),若符号位保持不变,就等于乘1/2。
3. 补码乘法规则
设被乘数 [x]补 = x0.x1x2…xn 和乘数 [y]补 = y0.y1y2…yn (注意:包括符号位共n+1位)均为任意符号,则有补码乘法算式
n
[x·y]补= [x]补·( -y0+∑ yi2-i )
i=1
为了推出串行逻辑(递推),实行分步算法,将上式展开加以变换:
[x·y]补 = [x]补·[ - y0 + y12-1 + y22-2 + … + yn2-n]
= [x]补·[ - y0 + (y1 - y12-1) + (y22-1 - y22-2) + … + (yn2-(n-1) - yn2-n)]
= [x]补·[(y1 - y0) + (y2 - y1) 2-1 + … + (yn - yn-1) 2-(n-1) + (0 - yn)2-n]
= [x]补·[...................................] (yn+1 = 0)
写成递推公式如下:
[ z0 ]补 = 0 (赋初值0)
[ z1 ]补 = 2 -1{ [ z0 ]补 + ( yn+1 - yn ) [x]补 } (yn+1 = 0)
; 注:2 -1表示右移,带符号扩展。补码的加减法在移位时不考虑进位C
…
[ zi ]补 = 2 -1{ [ zi-1 ]补 + ( yn-i+2 - yn-i+1 ) [x]补 }
…
[ zn ]补 = 2 -1{ [ zn-1 ]补 + ( y2 - y1 ) [x]补 }
[ zn+1 ]补 = [ zn ]补 + ( y1 - y0 ) [x]补 = [ x·y ]补 此最后一步不需要移位(对纯小数!)
开始时,部分积为 0,即 [z0]补 = 0。然后每一步都是在前次部分积的基础上,由 ( yi+1 - yi ) ( i = 0,1,2,…,n) 决定对[x]补的操作,再右移一位,得到新的部分积。如此重复 n + 1步,最后一步不移位,便得到 [ x·y ]补 ,这就是有名的Booth布斯算法。
实现这种补码乘法规则时,在乘数最末位后面要增加一位补充位 yn+1 。开始时,由 ynyn+1 判断第一步该怎么操作;然后再由 yn - 1 yn 判断第二步该怎么操作。因为每做一步要右移一位,故做完第一步后,yn - 1 yn 正好移到原来 ynyn+1 的位置上。依此类推,每步都要用 ynyn+ 1 位置进行判断,我们将这两位称为判断位。
如果判断位 ynyn+1 = 01,则 yi+1- yi = 1,做加[x]补操作;
如果判断位 yn yn+1 = 10,则 yi+1 -yi = - 1,做加[ - x]补(或者-[x]补)操作;
如果判断位 yn yn+1 = 11 或 00,则 yi+1-yi = 0,[ zi ] 加0,即保持不变。
4. 补码一位乘法运算规则
(1) 如果 yn = yn+1,部分积 [ zi ] 加0,再右移一位;
(2) 如果 yn yn+1 = 01,部分积加[ x ]补,再右移一位;
(3) 如果 yn yn+1 = 10,部分积加[ - x]补(或减[x]补),再右移一位;
这样重复进行 n+1 步,但最后一步不移位(对纯小数)。包括一位符号位,所得乘积为 2n+1 位,其中 2n 为尾数位数。对于码整数相乘,最后一步也要移位!乘积有2n+2 位,其中 2n 为尾数位数。
【例 】 x = 0.1101, y = 0.1011,用补码一位乘法计算 x·y = ?
[解:] 求解过程如下:
所以 [x · y]补 = 0.10001111
http://img.blog.163.com/photo/YWMCGuemn618MupDNNsEhA==/1983554160880616992.jpghttp://img.blog.163.com/photo/umbxqMMe60IoK1F2AZJ5hw==/1983554160880616994.jpghttp://img.blog.163.com/photo/rHqQ2sJwW7iR7iEVyuudEA==/1983554160880616995.jpghttp://img.blog.163.com/photo/j1DpgRWIfWJrk06wn-GOew==/1983554160880616997.jpghttp://img.blog.163.com/photo/LiZDyobHjTApuc2rqQ7BJg==/5364631581128664751.jpghttp://img.blog.163.com/photo/dFpS7fdXDZAOs2_ejujfDA==/1983554160880616998.jpg
实现32位Booth乘法算法的流程图
例:用Booth算法计算2×(-3)。
解:[2]补=0010,[-3]补=1101,在乘法开始之前,R0和R1中的初始值为0000和1101,R2中的值为0010。
在乘法的第一个循环中,判断R1的最低位和辅助位为10,所以进入步骤1c,将R0的值减去R2的值,结果1110送人R0,然后进人第二步,将R0和Rl右移一位,R0和R1的结果为11110110,辅助位为l。
在第二个循环中,首先判断Rl的最低位和辅助位为0l,所以进入步骤1b,作加法,R0+R2=1111+0010,结果0001送入R0,这时R0R1的内容为0001 0110,在第二步右移后变为0000 1011,辅助位为0。
在第三次循环中,判断位为10,进入步骤lc,R0减去R2,结果1110送入R0,R1不变;步骤2移位后R0和R1的内容为1111 01011,辅助位为1。
第四次循环时,因两个判断位为11,所以不作加减运算,向右移位后的结果为1111 1010,这就是运算结果(—6)。
这个乘法的过程描述如下表所示,表中乘积一栏表示的是R0、R1的内容以及一个辅助位P,黑体字表示对两个判断位的判断。
除法人的思维是原码一位除,计算机一般使用补码除法…
大家都知道试商嘛,计算机试商简单:全部试成1就好。。
除法和乘法的速度比较主要看电子原件的设计和精度啦…差别没有人那么大…
现代计算机使用ALU算数逻辑单元(74181)实现运算。。通过标志位的选择,可以实现取非、减一、与非、与或等等操作。。。从计算量上面来说,除法和乘法差不多,过程上面都给出来了,由于电子元件不同、运算不同,只有有很细微的差别。这个差别远远小于阵列乘法器、阵列除法器、加法进位链等结构优化带来的差别。
90
支持者: 小破君 喜乐喜乐 iamsincerea Happinase gildor 更多
这个念头在脑子里翻腾了几天了,终于有时间写一下。其实没什么实用的东西,主要是自己理清一下思路。
节省时间直接看下面这一段话就行:
对于完全一样的数字等式关系,为什么除法比乘法难?19/7.6=2.5怎么看都比7.6*2.5=19要难?
不光因为除法是乘法的逆运算,更重要的是除法涉及“试错”,而且试错的过程本身就是乘法运算。所以其实“除法=(多次试错的)乘法+减法”
同理,开方比乘方难,减法比加法难。
其实想清楚之后,这个问题的答案非常简单,但在想到之前,却没那么清晰。
描述整个想到的过程不是为了凑字数,只是想理清思路。
事情是这样的:
当时我正在公交车上假寐,脑子里回忆一个没什么实用价值的装B知识点,“A4纸为什么要叫A4?”
这是一个NB到爆的“格物致知”的例子,源链接如下(强烈推荐):http://blog.renren.com/blog/232354938/870092190
通过现象反推回原理,很了不起。
简述结论如下:其实A4就是A0纸对折4次之后的纸张,面积是A0的1/16。而A0纸是一张面积为1平方米、长宽符合一个特殊比例的纸张。这个特殊比例保证了纸张不管怎么对折,长宽比都不变。
设长方形宽为x,长为y,对折前大长方形长宽比例为y/x,对折后小长方形长宽比为x/(y/2),有方程
y/x=2x/y
解得
y=根号2*x
由于大长方形面积为1,所以有xy=1,代入y得到
根号2*(x^2)=1.
解二元一次方程组是相对容易的,但怎么在闭着眼睡觉的情况下解涉及开方的一元二次方程?
首先化简,解得
x^2=(根号2)/2=1.414/2=0.707
如何给0.707开方?
试错(会计财务管理里管这叫“内插法”,真TM给力啊)。
0.8的平方是0.64,0.9的平方是0.81,所以x在0.8和0.9之间。
0.85的平方是0.7225(脑中进行85平方的运算),0.84的平方是0.7056,说明x在0.84和0.85之间而且很接近0.84。
很可能就是0.841. 脑子里进行0.841的平方,得到0.707281。OK了,所以A0纸的宽边长度为0.841米。
x=0.841
解答完毕
这次思维训练至少有两个收获:
1、从此再装B说你知道为什么A4纸叫A4时更有底气了,因为自己算过一次印象更深。
2、深刻地明白了为什么开方比乘方难这么多……如果要算0.841的平方,直接口算三位数乘法即可;但要算0.707的开方,却要经过多次平方试错。
推而广之,除法为什么比乘法难?
乘法是怎么运算的?
1、将乘数拆解成类似一位数的形式(如123拆解成100、20、3)
2、用被乘数分别乘以拆解后的各位数字,得到不同位相乘的积
3、将积全部相加,得到总的积
所以乘法里包括了乘法口诀回忆和加法运算,而实质上乘法就是加法(3*4就是4个3相加,如果不存在乘法口诀这种东西,乘法就是加法)
除法是怎么运算的?
1、看一眼算式,大致估计出被除数是除数的几倍
2、用除数乘以估值得到积
3、用被除数减去这个积得到差
4、进行判断,这个差应大于0且小于除数,否则就要重新估值
除法运算中天然就涉及了乘法和减法运算,而且乘法的过程还包含了试错过程,其“运算有效率”不是100%,自然会比乘法本身难很多。
同理,由于包含借位过程,减法比加法难。5+18=23,直接个位相加并进位、十位相加得结果即可。23-18=5却需要先判断个位3比8小需要向十位借1,得出个位为5,然后被减数的十位2-1变成1再去减减数的十位,复杂度明显上升。
节省时间直接看下面这一段话就行:
对于完全一样的数字等式关系,为什么除法比乘法难?19/7.6=2.5怎么看都比7.6*2.5=19要难?
不光因为除法是乘法的逆运算,更重要的是除法涉及“试错”,而且试错的过程本身就是乘法运算。所以其实“除法=(多次试错的)乘法+减法”
同理,开方比乘方难,减法比加法难。
其实想清楚之后,这个问题的答案非常简单,但在想到之前,却没那么清晰。
描述整个想到的过程不是为了凑字数,只是想理清思路。
事情是这样的:
当时我正在公交车上假寐,脑子里回忆一个没什么实用价值的装B知识点,“A4纸为什么要叫A4?”
这是一个NB到爆的“格物致知”的例子,源链接如下(强烈推荐):http://blog.renren.com/blog/232354938/870092190
通过现象反推回原理,很了不起。
简述结论如下:其实A4就是A0纸对折4次之后的纸张,面积是A0的1/16。而A0纸是一张面积为1平方米、长宽符合一个特殊比例的纸张。这个特殊比例保证了纸张不管怎么对折,长宽比都不变。
设长方形宽为x,长为y,对折前大长方形长宽比例为y/x,对折后小长方形长宽比为x/(y/2),有方程
y/x=2x/y
解得
y=根号2*x
由于大长方形面积为1,所以有xy=1,代入y得到
根号2*(x^2)=1.
解二元一次方程组是相对容易的,但怎么在闭着眼睡觉的情况下解涉及开方的一元二次方程?
首先化简,解得
x^2=(根号2)/2=1.414/2=0.707
如何给0.707开方?
试错(会计财务管理里管这叫“内插法”,真TM给力啊)。
0.8的平方是0.64,0.9的平方是0.81,所以x在0.8和0.9之间。
0.85的平方是0.7225(脑中进行85平方的运算),0.84的平方是0.7056,说明x在0.84和0.85之间而且很接近0.84。
很可能就是0.841. 脑子里进行0.841的平方,得到0.707281。OK了,所以A0纸的宽边长度为0.841米。
x=0.841
解答完毕
这次思维训练至少有两个收获:
1、从此再装B说你知道为什么A4纸叫A4时更有底气了,因为自己算过一次印象更深。
2、深刻地明白了为什么开方比乘方难这么多……如果要算0.841的平方,直接口算三位数乘法即可;但要算0.707的开方,却要经过多次平方试错。
推而广之,除法为什么比乘法难?
乘法是怎么运算的?
1、将乘数拆解成类似一位数的形式(如123拆解成100、20、3)
2、用被乘数分别乘以拆解后的各位数字,得到不同位相乘的积
3、将积全部相加,得到总的积
所以乘法里包括了乘法口诀回忆和加法运算,而实质上乘法就是加法(3*4就是4个3相加,如果不存在乘法口诀这种东西,乘法就是加法)
除法是怎么运算的?
1、看一眼算式,大致估计出被除数是除数的几倍
2、用除数乘以估值得到积
3、用被除数减去这个积得到差
4、进行判断,这个差应大于0且小于除数,否则就要重新估值
除法运算中天然就涉及了乘法和减法运算,而且乘法的过程还包含了试错过程,其“运算有效率”不是100%,自然会比乘法本身难很多。
同理,由于包含借位过程,减法比加法难。5+18=23,直接个位相加并进位、十位相加得结果即可。23-18=5却需要先判断个位3比8小需要向十位借1,得出个位为5,然后被减数的十位2-1变成1再去减减数的十位,复杂度明显上升。
- 为什么除法比乘法难?
- 移位运算为什么比乘法除法快
- ARM上除法比乘法执行慢
- 位移与乘法/除法
- 慎用乘法和除法
- 大数乘法&除法
- 高精度乘法和除法
- 乘法、除法与 0
- 大数乘法除法
- 乘法/除法与移位
- 大数乘法,加法,除法运算
- 大数加法.减法.乘法.除法
- 大整数乘法和除法
- js的安全乘法、除法
- 高精度加法减法乘法除法
- 大数 (整数)乘法,除法
- 乘法、除法汇编指令总结
- 多项式的乘法和除法
- android EditText自定义软键盘光标问题
- IE 下不支持trim()
- 用HTML5 Audio API开发游戏音乐
- cocos2d-x 22种特效
- png、jpg、gif三种图片格式的区别
- 为什么除法比乘法难?
- linux不能ping通域名能ping通ip
- 从epoll构建muduo-3 加入第一个类,顺便介绍reactor
- 解决RedHat6/CentOS6系统中“弹出界面eth0:设备似乎不存在”的问题
- 总结一下Python IDLE快捷键
- 虚拟化存储的学习笔记
- 11054 - Wine trading in Gergovia
- cocos2d-x 切换场景动画
- MICROKERNEL-BASED OPERATING SYSTEMS