如何在Java中对BigDecimal进行分数幂运算?
在我的小项目中,我需要做一些类似于如何在Java中对BigDecimal进行分数幂运算?,java,formula,bigdecimal,pow,Java,Formula,Bigdecimal,Pow,在我的小项目中,我需要做一些类似于Math.pow(7777.665555.44)的事情,只需要非常大的数字。我遇到了一些解决方案: 使用double-但是数字太大了 使用BigDecimal.pow但不支持小数 使用X^(A+B)=X^A*X^B公式(B是第二个数值的剩余部分),但同样不支持bigX或bigA,因为我仍然转换为double 使用某种泰勒级数算法或类似的方法-我的数学不是很好,所以如果我找不到任何解决方案(一些库或(A+B)^(C+D))的公式),这是我最后的选择 有人知道图
Math.pow(7777.665555.44)
的事情,只需要非常大的数字。我遇到了一些解决方案:
- 使用
-但是数字太大了double
- 使用
但不支持小数BigDecimal.pow
- 使用
公式(X^(A+B)=X^A*X^B
是第二个数值的剩余部分),但同样不支持bigB
或bigX
,因为我仍然转换为doubleA
- 使用某种泰勒级数算法或类似的方法-我的数学不是很好,所以如果我找不到任何解决方案(一些库或
)的公式),这是我最后的选择(A+B)^(C+D)
我找到了一个名为ApFloat的库,它声称可以大致做到这一点,但我得到的结果非常近似,甚至
8^2
都给了我60
…指数=对数
查看1.7976931348623157E308(Double.MAX_值)以下参数的解决方案,但支持数百万位数的结果: 由于double支持最大值为100的数字(例如,double中的100!看起来是这样的:9.3326215443944415E157),因此使用BigDecimal.doubleValue()没有问题。但是你不应该只做数学。pow(double,double),因为如果结果大于MAX_值,你就会得到无穷大。因此:使用公式X^(A+B)=X^A*X^B将计算分为两个幂,大的使用BigDecimal.pow,小的(第二个参数的剩余部分)使用Math.pow,然后相乘。X将被复制到DOUBLE-确保它不大于MAX_值,A将为INT(最大值为2147483647,但BigDecimal.pow无论如何不支持大于十亿的整数),B将为DOUBLE,始终小于1。通过这种方式,您可以执行以下操作(忽略我的私有常量等): 结果示例:
50!^10! = 12.50911317862076252364259*10^233996181
50!^0.06 = 7395.788659356498101260513
MIT许可证下发布的库有一个简单的静态帮助程序
BigDecimalMath.log(BigDecimal,MathContext)
for log和BigDecimal未包含的许多其他函数。使用非常简单,并且有大量的基准数据来比较性能。您能举一个您尝试实现的例子吗,8^2!=64听起来很糟糕,2^100^100需要缩小。我必须说我尝试了公式技巧,到目前为止,即使是百万位数的数字,它也可以正常工作!(看起来我对double和int不太了解)。。。例子:50^10! = 12.50911317862076252364259*10^233996181 50!^0.06=7395.788659356498101260513在这里发布的代码有点长,但您可以理解X^(a+B)=X^a*X^B。。。现在,我正试图理解它是如何以及为什么(以及是否)处理如此庞大的数字的。我已经给出了解决方案。这个问题的公认答案所引用的源代码提供了比自然日志更多的解决方案。@Prunge-谢谢。我从来没有说过任何关于天然木材的事。真的,如果你看看马林基因的公认答案,他所描述的是对数。X^(A+B)=X^AX^B等于log(base X)A+log(base X)B=log(base X)(AB)。这应该允许您将数字调整到可管理的数量级。如果没有CalculatorUtils
、CalculatorConstants
、或CalculatorException
类,这是没有用的
50!^10! = 12.50911317862076252364259*10^233996181
50!^0.06 = 7395.788659356498101260513