Algorithm 做一个非常大的计算

Algorithm 做一个非常大的计算,algorithm,module,numbers,Algorithm,Module,Numbers,我想计算值X=n/2^r where n<10^6 and r<10^6 and it's guarantee that value of X is between O to 10 请注意,逆模很容易计算,2^r%101也可以计算 问题: 不能保证X总是整数,也可以是浮点。 当X是整数时,我的方法可以正常工作?当X是浮点数时如何处理查找2出现在n中的幂。这是: P = n / 2 + n / 2^2 + n / 2^3 + ... 使用整数除法,直到得到0结果 如果p>=r,则

我想计算值

X=n/2^r

where n<10^6 and r<10^6
and it's guarantee that value of X is between O to 10 
请注意,逆模很容易计算,2^r%101也可以计算

问题:
不能保证X总是整数,也可以是浮点。
当X是整数时,我的方法可以正常工作?当X是浮点数时如何处理

查找
2
出现在
n中的幂。这是:

P = n / 2 + n / 2^2 + n / 2^3 + ...
使用整数除法,直到得到
0
结果

如果
p>=r
,则得到一个整数结果。您可以通过计算阶乘来找到此结果,从而忽略
2
r
幂。比如:

factorial = 1
for i = 2 to n:

    factor = i
    while factor % 2 == 0 and r != 0:
        factor /= 2
        r -= 1

    factorial *= factor

如果
p
,设置
r=p
,应用相同的算法,最后将结果除以
2^(初始值\r-p)

如果近似结果正常,并且您可以访问具有base-2指数(
exp2
在C中)、自然对数伽马(
lgama
在C中)和自然对数的数学库(
log
in C),然后您可以

exp2(lgamma(n+1)/log(2) - r).

除了极少数情况(小n和r)外,X不是整数——因为如果n>=11,则11除以n!但不除以2的任何幂,因此如果X是整数,则它必须至少为11


一种方法是:将X初始化为1;然后循环:如果X>10除以2,直到它不是;如果X<10乘以下一个因子,直到它不是;直到你用完因子和2的幂。

一种可调整精度/性能的方法如下:

将阶乘存储在具有固定位数的整数中。如果位数太大,我们可以删除最后几位,因为它们不会对整体结果产生太大的影响。通过将此整数放大/缩小,算法的性能或精度都可以调整

每当整数因乘法而溢出时,将其向右移动几位,然后从
r
中减去该值。最后,应该有一个小数字作为
r
和一个整数
v
,其中包含阶乘的最高有效位。这个
v
现在可以解释为一个定点带有
r
小数位数的数字


根据所需的精度,这种方法甚至可能适用于
long
,尽管我还没有时间测试这种方法,只是用计算器做了一点实验。

类似
3/2.0*4/2.0*5/2.0*…
?@Paul你可以通过除以2秒将X减少到10或以下,正如我所说的。既然答案是肯定的os不大于10必须有足够的2。答案是低于10的浮点值。正如我在评论中指出的,最高的
n
,这样
X
在每个步骤中都可以还原为低于10的值是4。只需使用
5!
试试你的方法。
exp2(lgamma(n+1)/log(2) - r).