java - 对双数取模

标签 java algorithm module double precision

我给出了两个数字 ab。我必须计算 (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/

相关文章:

algorithm - 查找数组中具有模式的最小元素

python - 蜗牛算法 - 控制遍历的最大/最小位置

c# - 数码相机算法

string - ocaml 中的错误链接模块

java - 绕过 Android 模块的循环依赖?

java - 如何直接声明并将值分配给 hashMap

java - 如何使用 Java 和 Spring 在 REST Web 服务中 wait()?

import - 需要,导入,需要导入

java - 如何在外键上进行双向一对一关联

java - 我可以配置 Java 日志记录以使用 Spring Boot 日志记录吗?