我的思想是用数组存储,但是存储以后的算法不会.见有的兄弟说用减法实现,但是我觉得对于int[]/int[]是不太容易的事情!
高手指点,拜谢!
贴出源码,或是给出算法都可以!
8 个解决方案
#1
看见有人摆擂台,自己顶一个,不要逼我,我要用减法了
#2
可以把两个int[]的数变2进制,做减法就轻松了
#3
快速除法是通过乘法运算实现的。
比如现在有两个实数a,b,我们要计算b/a,可以先计算1/a,
1/a可以通过迭代实现:
x'=x*(2-a*x),
迭代收敛的速度很快。
然后计算b*(1/a)就可以计算出b/a.
而对于整数运算,我们需要将定点数看成是浮点数就可以了。
比如b/a, 其中2^(M-1)<=a<2^M,那么我们可以把a看成是a/2^M
我们需要计算(b/2^M)/(a/2^M).
然后计算a/2^M的倒数x,由于提供的乘法运算应该是整数(定点)运算,我们在实际计算过程中
直接使用y=x*2^M,通过迭代下面程序
y'=y*(2*2^M-(a*y)/2^M)
就可以解得y,得到a*y约等于2^(2M)
于是(b*y)/2^(2M)就是最终结果。
上面计算过程中假设数据是二进制表示的,如果是10进制表示,将2^M用10^N代替就可以了。
比如现在有两个实数a,b,我们要计算b/a,可以先计算1/a,
1/a可以通过迭代实现:
x'=x*(2-a*x),
迭代收敛的速度很快。
然后计算b*(1/a)就可以计算出b/a.
而对于整数运算,我们需要将定点数看成是浮点数就可以了。
比如b/a, 其中2^(M-1)<=a<2^M,那么我们可以把a看成是a/2^M
我们需要计算(b/2^M)/(a/2^M).
然后计算a/2^M的倒数x,由于提供的乘法运算应该是整数(定点)运算,我们在实际计算过程中
直接使用y=x*2^M,通过迭代下面程序
y'=y*(2*2^M-(a*y)/2^M)
就可以解得y,得到a*y约等于2^(2M)
于是(b*y)/2^(2M)就是最终结果。
上面计算过程中假设数据是二进制表示的,如果是10进制表示,将2^M用10^N代替就可以了。
#4
m
#5
mathe的是数值算法吗?
我要的是除法的精确算法,象手工算的那样,比如:1/3=0.33333333333333
最后的保留小数点后多少位有用户确定,比如说32位,只要计算到32位,后面
就割掉了,不存在四舍五入
我要的是除法的精确算法,象手工算的那样,比如:1/3=0.33333333333333
最后的保留小数点后多少位有用户确定,比如说32位,只要计算到32位,后面
就割掉了,不存在四舍五入
#6
是精确计算,公式中:y'=y*(2*2^M-(a*y)/2^M)
全部数字都是整数,而其中除2^M通过2进制移位运算来进行。
迭代若干步后y'就等于y了,这时必然有:
|y-b/a|<1
那么y,y+1,y-1中必然有一个数是精确值了。
全部数字都是整数,而其中除2^M通过2进制移位运算来进行。
迭代若干步后y'就等于y了,这时必然有:
|y-b/a|<1
那么y,y+1,y-1中必然有一个数是精确值了。
#7
把数字存在数组里,然后就像手工除法一样,一位位得商,余数, 不行吗?
#8
说的容易,做的难,我现在用的是减法,估计效率不高
#1
看见有人摆擂台,自己顶一个,不要逼我,我要用减法了
#2
可以把两个int[]的数变2进制,做减法就轻松了
#3
快速除法是通过乘法运算实现的。
比如现在有两个实数a,b,我们要计算b/a,可以先计算1/a,
1/a可以通过迭代实现:
x'=x*(2-a*x),
迭代收敛的速度很快。
然后计算b*(1/a)就可以计算出b/a.
而对于整数运算,我们需要将定点数看成是浮点数就可以了。
比如b/a, 其中2^(M-1)<=a<2^M,那么我们可以把a看成是a/2^M
我们需要计算(b/2^M)/(a/2^M).
然后计算a/2^M的倒数x,由于提供的乘法运算应该是整数(定点)运算,我们在实际计算过程中
直接使用y=x*2^M,通过迭代下面程序
y'=y*(2*2^M-(a*y)/2^M)
就可以解得y,得到a*y约等于2^(2M)
于是(b*y)/2^(2M)就是最终结果。
上面计算过程中假设数据是二进制表示的,如果是10进制表示,将2^M用10^N代替就可以了。
比如现在有两个实数a,b,我们要计算b/a,可以先计算1/a,
1/a可以通过迭代实现:
x'=x*(2-a*x),
迭代收敛的速度很快。
然后计算b*(1/a)就可以计算出b/a.
而对于整数运算,我们需要将定点数看成是浮点数就可以了。
比如b/a, 其中2^(M-1)<=a<2^M,那么我们可以把a看成是a/2^M
我们需要计算(b/2^M)/(a/2^M).
然后计算a/2^M的倒数x,由于提供的乘法运算应该是整数(定点)运算,我们在实际计算过程中
直接使用y=x*2^M,通过迭代下面程序
y'=y*(2*2^M-(a*y)/2^M)
就可以解得y,得到a*y约等于2^(2M)
于是(b*y)/2^(2M)就是最终结果。
上面计算过程中假设数据是二进制表示的,如果是10进制表示,将2^M用10^N代替就可以了。
#4
m
#5
mathe的是数值算法吗?
我要的是除法的精确算法,象手工算的那样,比如:1/3=0.33333333333333
最后的保留小数点后多少位有用户确定,比如说32位,只要计算到32位,后面
就割掉了,不存在四舍五入
我要的是除法的精确算法,象手工算的那样,比如:1/3=0.33333333333333
最后的保留小数点后多少位有用户确定,比如说32位,只要计算到32位,后面
就割掉了,不存在四舍五入
#6
是精确计算,公式中:y'=y*(2*2^M-(a*y)/2^M)
全部数字都是整数,而其中除2^M通过2进制移位运算来进行。
迭代若干步后y'就等于y了,这时必然有:
|y-b/a|<1
那么y,y+1,y-1中必然有一个数是精确值了。
全部数字都是整数,而其中除2^M通过2进制移位运算来进行。
迭代若干步后y'就等于y了,这时必然有:
|y-b/a|<1
那么y,y+1,y-1中必然有一个数是精确值了。
#7
把数字存在数组里,然后就像手工除法一样,一位位得商,余数, 不行吗?
#8
说的容易,做的难,我现在用的是减法,估计效率不高