Calculating nth root in Java using power method

后端 未结 9 2679
礼貌的吻别
礼貌的吻别 2021-02-18 22:08

I was trying to get a cubic root in java using Math.pow(n, 1.0/3) but because it divides doubles, it doesn\'t return the exact answer. For example, with 125, this g

9条回答
  •  死守一世寂寞
    2021-02-18 22:38

    Since it is not possible to have arbitrary-precision calculus with double, you have three choices:

    1. Define a precision for which you decide whether a double value is an integer or not.
    2. Test whether the rounded value of the double you have is a correct result.
    3. Do calculus on a BigDecimal object, which supports arbitrary-precision double values.

    Option 1

    private static boolean isNthRoot(int value, int n, double precision) {
        double a = Math.pow(value, 1.0 / n);
        return Math.abs(a - Math.round(a)) < precision; // if a and round(a) are "close enough" then we're good
    }
    

    The problem with this approach is how to define "close enough". This is a subjective question and it depends on your requirements.

    Option 2

    private static boolean isNthRoot(int value, int n) {
        double a = Math.pow(value, 1.0 / n);
        return Math.pow(Math.round(a), n) == value;
    }
    

    The advantage of this method is that there is no need to define a precision. However, we need to perform another pow operation so this will affect performance.

    Option 3

    There is no built-in method to calculate a double power of a BigDecimal. This question will give you insight on how to do it.

提交回复
热议问题