gpt4 book ai didi

java - 如何在 Java 中对 BigDecimal 进行小数幂运算?

转载 作者:行者123 更新时间:2023-11-30 12:04:37 25 4
gpt4 key购买 nike

在我的小项目中,我只需要对非常大的数字执行类似Math.pow(7777.66, 5555.44) 的操作。我遇到了一些解决方案:

  • 使用double - 但数字太大了
  • 使用 BigDecimal.pow 但不支持小数
  • 使用 X^(A+B)=X^A*X^B 公式(B 是第二个数的余数),但同样不支持对于大的 X 或大的 A 因为我仍然转换为 double
  • 使用某种泰勒级数算法或类似算法 - 我不是很擅长数学,所以如果我找不到任何解决方案(一些库或公式 (A+ B)^(C+D)).

有人知道图书馆或简单的解决方案吗?我想很多人都在处理同样的问题......

附注我找到了一些名为 ApFloat 的库,它声称可以近似地执行此操作,但我得到的结果非常近似,甚至 8^2 也给了我 60...

最佳答案

1.7976931348623157E308 (Double.MAX_VALUE) 以下参数的解决方案,但支持数百万位的结果:

由于 double 支持最大 MAX_VALUE 的数字(例如,100!在 double 中看起来是这样的:9.332621544394415E157),因此使用 BigDecimal.doubleValue() 没有问题。但是你不应该只做 Math.pow(double, double) 因为如果结果大于 MAX_VALUE 你只会得到无穷大。所以:使用公式 X^(A+B)=X^A*X^B 将计算分成两个幂,大的使用 BigDecimal.pow,小的(第二个参数的余数)使用 Math。战俘,然后乘以。 X 将被复制到 DOUBLE - 确保它不大于 MAX_VALUE,A 将是 INT(最大值为 2147483647,但 BigDecimal.pow 无论如何都不支持超过十亿的整数),B 将是双倍,始终小于 1。这样您就可以执行以下操作(忽略我的私有(private)常量等):

    int signOf2 = n2.signum();
try {
// Perform X^(A+B)=X^A*X^B (B = remainder)
double dn1 = n1.doubleValue();
// Compare the same row of digits according to context
if (!CalculatorUtils.isEqual(n1, dn1))
throw new Exception(); // Cannot convert n1 to double
n2 = n2.multiply(new BigDecimal(signOf2)); // n2 is now positive
BigDecimal remainderOf2 = n2.remainder(BigDecimal.ONE);
BigDecimal n2IntPart = n2.subtract(remainderOf2);
// Calculate big part of the power using context -
// bigger range and performance but lower accuracy
BigDecimal intPow = n1.pow(n2IntPart.intValueExact(),
CalculatorConstants.DEFAULT_CONTEXT);
BigDecimal doublePow =
new BigDecimal(Math.pow(dn1, remainderOf2.doubleValue()));
result = intPow.multiply(doublePow);
} catch (Exception e) {
if (e instanceof CalculatorException)
throw (CalculatorException) e;
throw new CalculatorException(
CalculatorConstants.Errors.UNSUPPORTED_NUMBER_ +
"power!");
}
// Fix negative power
if (signOf2 == -1)
result = BigDecimal.ONE.divide(result, CalculatorConstants.BIG_SCALE,
RoundingMode.HALF_UP);

结果示例:

50!^10! = 12.50911317862076252364259*10^233996181

50!^0.06 = 7395.788659356498101260513

关于java - 如何在 Java 中对 BigDecimal 进行小数幂运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57041229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com