我给出了两个数字 a
和 b
。我必须计算 (a^b)%1000000007
。我如何计算 float 字。例如:
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;
}
最佳答案
是的,在 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 - 对双数取模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36493266/