Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写自定义代码以计算BigDecimal幂_Java_Bigdecimal_Exponential - Fatal编程技术网

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

为了更好地学习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 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