Java 编写自定义代码以计算BigDecimal幂
为了更好地学习Java,我正在做一个计算器。我已经编写了自己的代码,用BigDecimal参数计算幂。到目前为止,代码无法处理分数幂,例如Java 编写自定义代码以计算BigDecimal幂,java,bigdecimal,exponential,Java,Bigdecimal,Exponential,为了更好地学习Java,我正在做一个计算器。我已经编写了自己的代码,用BigDecimal参数计算幂。到目前为止,代码无法处理分数幂,例如2^2.2。为了解决这个问题,我想在我的代码中实现指数标识X^(A+B)=X^A*X^B 如何确定BigDecimal参数op2的小数点右侧是否有数字,然后确定该值是多少?例如,代码将识别op2=2.2=2.0+0.2 我知道BigDecimal的scale()函数,但我不确定它是如何工作的。比如说, BigDecimal bd = new BigDecima
2^2.2
。为了解决这个问题,我想在我的代码中实现指数标识X^(A+B)=X^A*X^B
如何确定BigDecimal参数op2
的小数点右侧是否有数字,然后确定该值是多少?例如,代码将识别op2=2.2=2.0+0.2
我知道BigDecimal的scale()
函数,但我不确定它是如何工作的。比如说,
BigDecimal bd = new BigDecimal(2.1);
System.out.println(bd.scale());
> 51
BigDecimal bd = new BigDecimal(2.2);
System.out.println(bd.scale());
> 50
以下是计算功率的当前代码:
public static BigDecimal power(BigDecimal op1, BigDecimal op2)
{
boolean isOp1Zero;
if (op1.compareTo(new BigDecimal(0)) == 0)
isOp1Zero = true;
else
isOp1Zero = false;
int distFromZero = op2.compareTo(new BigDecimal(0));
//x^0 = 1
if (distFromZero == 0)
return new BigDecimal(1);
//0^positive = 0
else if (isOp1Zero && distFromZero == 1)
return new BigDecimal(0);
//non-zero^positive
else if (!isOp1Zero && distFromZero == 1)
{
BigDecimal power = op1;
for (int i = 1; i < op2.intValueExact(); i++)
{
power = power.multiply(op1);
}
return power;
}
//0^negative undefined
else if (isOp1Zero && distFromZero == -1)
throw new IllegalArgumentException("Error - zero to negative power");
//non-zero^negative
else if (!isOp1Zero && distFromZero == -1)
{
BigDecimal power = op1;
BigDecimal op2NoSign = op2.multiply(new BigDecimal(-1));
for (int i = 1; i < op2NoSign.intValueExact(); i++)
{
power = power.multiply(op1);
}
return new BigDecimal(1).divide(power);
}
return null;
}
公共静态BigDecimal幂(BigDecimal op1,BigDecimal op2)
{
布尔等参变量1为零;
if(op1.compareTo(新的BigDecimal(0))==0)
isOp1Zero=真;
其他的
isOp1Zero=假;
int distFromZero=op2.compareTo(新的BigDecimal(0));
//x^0=1
if(distFromZero==0)
返回新的BigDecimal(1);
//0^正=0
else if(isOp1Zero&&distFromZero==1)
返回新的BigDecimal(0);
//非零^正
else如果(!isOp1Zero&&distFromZero==1)
{
BigDecimal幂=op1;
对于(inti=1;i
任何建议,谢谢!谢谢。您可以选择使用
bd.rements(BigDecimal.ONE)
:
这将适用于正大小数
顺便说一句,我看不出这对你有什么帮助。如何计算
X^0.4
?(也就是说,不使用对数)您应该使用BigDecimal.valueOf()作为开始
BigDecimal bd = BigDecimal.valueOf(2.1);
b.scale() === 1
接下来,你应该计算出你的目标精度。除非您需要超过15位的精度,否则使用double会简单得多。但是,如果需要更高的精度,则应使用库来使用BigDecimal进行计算。e、 如果你使用Math.pow()你浪费了你的时间
为了计算幂,a^b=exp(log(a)*b)以此为例看看
BigDecimal.ZERO
,BigDecimal.ONE
,和。我总是检查小数点的方法是取数字,模1
。例如双余数=4.7%1代码><代码>余数将包含0.7
@christopher谢谢!事实上我之前就想到了,直到现在我才忘记。哎呀!但是我如何处理这样的事情:BigDecimal bd=newbigdecimal(2.1)代码>BigDecimal rements=bd.rements(新的BigDecimal(1))代码>System.out.println(余数)代码>>0.1000000000000088817841970012523233890533447265625
也许只是在一定数量的小数点后去掉剩余部分?这不重要,不是吗BigDecimal
具有任意精度是有原因的。尝试使用大小数执行幂运算。你永远不知道,它可能会很漂亮!谢谢我想我还是得求助于日志。事实是,每一个包含ln和exp的包,都有power.True。我自己写的幂函数只是为了练习,看看我能不能做到。
BigDecimal bd = BigDecimal.valueOf(2.1);
b.scale() === 1