Java 取双数模
我已经给出了两个数字Java 取双数模,java,algorithm,module,double,precision,Java,Algorithm,Module,Double,Precision,我已经给出了两个数字a和b。我必须计算(a^b)%100000007。如何计算浮点数。例如: a= 7.654 and b=10000 这是我的代码将%工作: public static double super_pow(double A , long B){ double o=1; while(B>0){ if((B&1)!=0) o*=A; A*=A;
a
和b
。我必须计算(a^b)%100000007
。如何计算浮点数。例如:a= 7.654 and b=10000
这是我的代码将%
工作:
public static double super_pow(double A , long B){
double o=1;
while(B>0){
if((B&1)!=0) o*=A;
A*=A;
B/=2;
o%=mod;
A%=mod;
}
return (o)%mod;
}
是
%
模吗?
这取决于你使用的语言。但一般来说,浮点值不知道模运算。你可以自己计算。假设正浮点数a=7.654
和b=10000.0
so
d = a/b = 0.0007654 // division
r = d-floor(d) = (0.0007654-0.0) = 0.0007654 // remainder
r = r*b = (0.0007654*10000.0) = 7.654 // rescale back
向下舍入到最接近的小于或等于楼层(x)
x的数字
保存浮点除法结果d
保存余数(模)r
a=123.456
和b=65
d = a/b = 1.8993230769230769230769230769231
r = (d-floor(d))*b = 58.456
这可用于a、b的整数值和十进制数值,但要注意,浮点单元执行舍入操作,可能会在数位数后失去精度。。。如果我没记错的话,64位double
变量通常最多可使用18位
[Edit1]嗯,你把问题重新编辑成了完全不同的问题
因此,您正在搜索modpow
。您可以在google上搜索modpow
的java实现。举个例子
在32位整数运算中,可以找到C++的GUI实现,但具有特定属性的静态模素数。如果你改变了所有的
if (DWORD(d)>=DWORD(p)) d-=p;
至d=d%p代码>它适用于任何模。您需要modpow、modmul、modadd、modsub
是的,在Java中,您可以对浮点类型使用%运算符
但是,指数会有问题:不能使用%
来减少中间结果,因为模不分布在浮点乘法上:(a*b)%c
不是(a%c)*(b%c)
。如果你试图直接计算7.654^10000,你会得到无穷大;它超过了double
的最大值。即使没有,您也不能信任结果的最低数字,因为它们是由舍入和表示错误产生的纯噪声
您可以使用一个实现精确算法的库,例如java.math.BigDecimal,但这将在执行时间和内存方面花费很多。如果你认为你需要做这个计算作为一个更大问题的一部分,也许你应该后退一步,找到另一种方法
编辑:以下是使用BigDecimal
的结果:
BigDecimal[] divmod = new BigDecimal("7.654").pow(10000)
.divideAndRemainder(new BigDecimal("1000000007"))
return divmod[1].doubleValue() // I get 9.01287592373194E8
在java中,可以对浮点/双精度()
如果必须计算(a^b)%1000000007,您可以使用double
计算a
和b
(),这使得求幂更容易,请使用pow()
方法()
或者,您可以将^b的结果键入到long
,然后使用
double pow = Math.pow(A,B);
long mod = (long) pow%1000000007L; // the 'L' is important see https://stackoverflow.com/questions/5737616/what-is-the-modulo-operator-for-longs-in-java
return mod; //return a long not double in function
如果该语言缺少浮点模运算符,则其标准库可能有一个函数,如中的fmod
C@Joni是的,但这是一个很好的知道它做什么,如何无论如何,以及什么是要知道的。。。我回答的时候没有语言标签,所以我做了计算,而不是建议libhmm你把问题重新编辑成完全不同的问题。。。见我的回答[edit1]
double pow = Math.pow(A,B);
long mod = (long) pow%1000000007L; // the 'L' is important see https://stackoverflow.com/questions/5737616/what-is-the-modulo-operator-for-longs-in-java
return mod; //return a long not double in function