java - 如何在 Java 中计算 ((Integer)^(double)) % (Integer)?

标签 java math

我正在尝试计算 (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.344310^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/

相关文章:

java - 将集合 A 复制到集合 B 并包含集合 A 的子类?用于接受在线订单。 java

java - 如何自动构建混合的 Scala\Java Eclipse 工作区?

java - Eclipse 中的数学(Android)

c# - 有没有办法在 .NET 中进行 'correct' 算术舍入?/C#

math - 推断用户群增长率线性+病毒式增长

java - ArrayAdapter位置错误

java - Android 更新新版本后重新启动应用程序

java - 模拟一个具体的类——它总是空的

计算段中的一个(二进制)

python - 数字方式的矩阵组合逻辑