我正在尝试计算 (10^5.102103)%24 的值,即 10 在 Java 中的 5.102103 模数 24 次幂?
哪种方法最好最准确,因为
int a;
double b;
int m;
计算(a^b)%m
其中 a 可以非常大,例如 10^9
b 可以是任何可以很大的 double 或浮点值
m是任意整数
示例 --- 如何计算
的值(10^10002.3443)%10000007
我知道 Math.pow(a,b) 函数只适用于小的 a 和 b
虽然 BigInteger 函数仅使用 modPow(a,b),其中 a 和 b 应该仅为整数(如果我错了请纠正我)
最佳答案
不幸的是,使用普通的 Java 数据类型不可能得到正确的答案。如果您使用 double
来存储指数,则会引入错误,因为 double
不会准确存储大多数小数。当您编写 double b = 10002.3443;
时,存储在 b
中的数字实际上是 10002.34430000000065774656832218170166015625
。尽管当您打印它时它看起来像 10002.3443
,但这是 Java 打印数字方式的一个技巧 - 基本上它会选择小数位数最少的十进制数字,该数字将由该 double 表示。
现在这个差异看起来微不足道。但是 10^10002.3443
和 10^10002.34430000000065774656832218170166015625
的差值大约是 3.346 x 10^9990
,这是一个 9991 位的数字。现在,当我们应用模数运算符时,这种差异会变成什么?
(10^10002.34430000000065774656832218170166015625 % 10000007) - (10^10002.3443 % 10000007)
= (10^10002.34430000000065774656832218170166015625 - 10^10002.3443) % 10000007
= (3.346 x 10^9990) % 10000007 (approximately)
现在,任何人都可以猜测实际发生了什么。但是,如果您在计算中的任何时候使用 double
,则被闪电击中的几率比得到正确答案的几率大。
另一个选项可能是 BigDecimal
。但问题是 10^10002.3443
是无理数 - 它不是终止小数,因此无法在 BigDecimal
中正确表示。
因此 Java 没有一种数据类型可以让您执行您想要执行的计算。
您将不得不发明自己的数据类型,然后找出如何进行所有位运算以实现求幂和取模。这是一个巨大的项目,我建议您首先获得数学博士学位。
(注意:显然,我在上面使用 ^
表示求幂,使用 x
表示乘法,尽管这不是正常的 Java 约定)
关于java - 如何在 Java 中计算 ((Integer)^(double)) % (Integer)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26900861/