Calculating nth root in Java using power method

后端 未结 9 2677
礼貌的吻别
礼貌的吻别 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:19

    You can use some tricks come from mathematics field, to havemore accuracy. Like this one x^(1/n) = e^(lnx/n).

    Check the implementation here: https://www.baeldung.com/java-nth-root

    0 讨论(0)
  • 2021-02-18 22:20

    Here is the solution without using Java's Math.pow function. It will give you nearly nth root

    public class NthRoot {
    
    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            int testcases = scanner.nextInt();
            while (testcases-- > 0) {
                int root = scanner.nextInt();
                int number = scanner.nextInt();
                double rootValue = compute(number, root) * 1000.0 / 1000.0;
                System.out.println((int) rootValue);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static double compute(int number, int root) {
        double xPre = Math.random() % 10;
        double error = 0.0000001;
        double delX = 2147483647;
        double current = 0.0;
    
        while (delX > error) {
            current = ((root - 1.0) * xPre + (double) number / Math.pow(xPre, root - 1)) / (double) root;
            delX = Math.abs(current - xPre);
            xPre = current;
        }
        return current;
    }
    
    0 讨论(0)
  • 2021-02-18 22:24

    Well this is a good option to choose in this situation. You can rely on this-

       System.out.println("     ");
       System.out.println("     Enter a base and then nth root");
       while(true)
       {
           a=Double.parseDouble(br.readLine());
           b=Double.parseDouble(br.readLine());
           double negodd=-(Math.pow((Math.abs(a)),(1.0/b)));
           double poseve=Math.pow(a,(1.0/b));
           double posodd=Math.pow(a,(1.0/b));
           if(a<0 && b%2==0)
           {
               String io="\u03AF";
               double negeve=Math.pow((Math.abs(a)),(1.0/b));
               System.out.println("     Root is imaginary and value= "+negeve+" "+io);
           }
           else if(a<0 && b%2==1)
           System.out.println("     Value= "+negodd);
           else if(a>0 && b%2==0)
           System.out.println("     Value= "+poseve);
           else if(a>0 && b%2==1)
           System.out.println("     Value= "+posodd);
           System.out.println("     ");
           System.out.print("     Enter '0' to come back or press any number to continue- ");
           con=Integer.parseInt(br.readLine());
           if(con==0)
           break;
           else
           {
               System.out.println("     Enter a base and then nth root");
               continue;
           }
        }
    
    0 讨论(0)
  • 2021-02-18 22:25

    It's a pretty ugly hack, but you could reach a few of them through indenting.

    System.out.println(Math.sqrt(Math.sqrt(256)));
        System.out.println(Math.pow(4, 4));
        System.out.println(Math.pow(4, 9));
        System.out.println(Math.cbrt(Math.cbrt(262144)));
    Result:
    4.0
    256.0
    262144.0 
    4.0
    

    Which will give you every n^3th cube and every n^2th root.

    0 讨论(0)
  • 2021-02-18 22:28

    Find nth root Using binary search method. Here is the way to find nth root with any precision according to your requirements.

    import java.util.Scanner;
    
    public class FindRoot {
    
        public static void main(String[] args) {
            try (Scanner scanner = new Scanner(System.in)) {
                int testCase = scanner.nextInt();
                while (testCase-- > 0) {
                    double number = scanner.nextDouble();
                    int root = scanner.nextInt();
                    double precision = scanner.nextDouble();
                    double result = findRoot(number, root, precision);
                    System.out.println(result);
                }
            }
        }
    
        private static double findRoot(double number, int root, double precision) {
            double start = 0;
            double end = number / 2;
            double mid = end;
            while (true) {
                if (precision >= diff(number, mid, root)) {
                    return mid;
                }
                if (pow(mid, root) > number) {
                    end = mid;
                } else {
                    start = mid;
                }
                mid = (start + end) / 2;
            }
        }
    
        private static double diff(double number, double mid, int n) {
            double power = pow(mid, n);
            return number > power ? number - power : power - number;
        }
    
        private static double pow(double number, int pow) {
            double result = number;
            while (pow-- > 1) {
                result *= number;
            }
            return result;
        }
    }
    
    0 讨论(0)
  • 2021-02-18 22:36

    The Math.round function will round to the nearest long value that can be stored to a double. You could compare the 2 results to see if the number has an integer cubic root.

    double dres = Math.pow(125, 1.0 / 3.0);
    double ires = Math.round(dres);
    double diff = Math.abs(dres - ires);
    if (diff < Math.ulp(10.0)) {
        // has cubic root
    }
    

    If that's inadequate you can try implementing this algorithm and stop early if the result doesn't seem to be an integer.

    0 讨论(0)
提交回复
热议问题