Yo estaba tratando de conseguir una raíz cúbica en java utilizando Math.pow(n, 1.0/3) pero debido a que se divide en dobles, no devuelve la respuesta exacta. Por ejemplo, con 125, esto le da 4.9999999999. Hay una solución para esto? Sé que hay una raíz cúbica de la función, pero me gustaría solucionar esto para que yo pueda calcular superior raíces.

No me gustaría porque quiero saber si un número tiene una raíz entera por hacer algo como esto: Math.pow(n, 1.0 /3) % ((int) Math.pow(n, 1.0 /3)).

Uso de la clase BigDecimal, que es la representación decimal de los números reales con precisión arbitraria.
Por supuesto, no hay ningún método para calcular las raíces enésimas de la clase BigDecimal. Por lo que se necesita para aplicar a ti mismo. Me gustaría darle el método de newton raphson método de una oportunidad. Consulte aquí.

OriginalEl autor Sara Alaa Khodeir | 2015-09-13

8 Comentarios

  1. 6

    Ya que no es posible tener precisión arbitraria cálculo con double, usted tiene tres opciones:

    1. Definir una precisión para que usted decida si un double valor es un número entero o no.
    2. Prueba si el valor redondeado de la double que usted tiene es un resultado correcto.
    3. Hacer cálculos en una BigDecimal objeto, que apoya arbitraria-doble de la precisión de los valores.

    Opción 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
    }

    El problema con este enfoque es cómo definir «lo suficientemente cerca». Esta es una cuestión subjetiva, y depende de sus necesidades.

    Opción 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;
    }

    La ventaja de este método es que no es necesario definir una precisión. Sin embargo, tenemos que realizar otra pow operación, de manera que esto afectará el rendimiento.

    Opción 3

    No hay ningún método integrado para calcular el doble de la potencia de un BigDecimal. Esta pregunta le dará una idea de cómo hacerlo.

    OriginalEl autor Tunaki

  2. 5

    La De Matemáticas.ronda función redondea valor long que puede ser almacenado a una doble. Se puede comparar el 2 resultados para ver si el número tiene un número entero raíz cúbica.

    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
    }

    Si que es inadecuado que se puede intentar aplicar este y el algoritmo de parada antes si el resultado no parece ser un número entero.

    Sé que esto es correcto, pero yo no podía hacer eso porque me necesita para asegurarse de que el número es un entero de la raíz, me acaba de editar la pregunta para incluir este.
    esto es lo que ya se ha mencionado en la pregunta. que él;s no obtener resultado exacto y no quiero redondear el resultado.
    He editado la respuesta, según la edición pregunta
    Gracias!
    y por lo tanto eliminado mi downvote. Saludos!!

    OriginalEl autor Manos Nikolaidis

  3. 1

    Me gustaría ir para implementar mi propia función para hacer esto, posiblemente basada en este método.

    Este problema tiene más que ver con la manera en que la precisión se define por la double, no tanto el método que se utiliza.

    OriginalEl autor dimplex

  4. 1

    Escribí este método para calcular la floor(x^(1/n)) donde x es un no-negativo BigInteger y n es un entero positivo. Se fue hace un tiempo ahora, así que no puede explicar por qué funciona, pero estoy razonablemente seguro de que cuando lo escribí estaba feliz de que está garantizado para dar la respuesta correcta en forma razonablemente rápida.

    A ver si x exactamente n-th poder se puede comprobar si el resultado elevado a la potencia n da exactamente x de nuevo.

    public static BigInteger floorOfNthRoot(BigInteger x, int n) {
        int sign = x.signum();
        if (n <= 0 || (sign < 0))
            throw new IllegalArgumentException();
        if (sign == 0)
            return BigInteger.ZERO;
        if (n == 1)
            return x;
        BigInteger a;
        BigInteger bigN = BigInteger.valueOf(n);
        BigInteger bigNMinusOne = BigInteger.valueOf(n - 1);
        BigInteger b = BigInteger.ZERO.setBit(1 + x.bitLength() / n);
        do {
            a = b;
            b = a.multiply(bigNMinusOne).add(x.divide(a.pow(n - 1))).divide(bigN);
        } while (b.compareTo(a) == -1);
        return a;
    }

    A utilizar:

    System.out.println(floorOfNthRoot(new BigInteger("125"), 3));

    Editar
    Después de haber leído los comentarios anteriores yo ahora, recuerde que este es el método de Newton-Raphson el método de la n-ésima raíz. El método de Newton-Raphson método tiene convergencia cuadrática (que en el lenguaje cotidiano significa que es rápido). Usted puede probar en los números que tienen docenas de dígitos y debe obtener la respuesta en una fracción de segundo.

    Usted puede adaptar el método para trabajar con otros tipos de números, pero double y BigDecimal son en mi opinión no es adecuado para este tipo de cosas.

    OriginalEl autor Paul Boddington

  5. 0

    Bien esta es una buena opción a elegir en esta situación.
    Usted puede confiar en esta-

    OriginalEl autor Avneesh Singh

  6. 0

    Es bastante feo hack, pero se puede llegar a algunos de ellos a través de la sangría.

    Que le dará todos los n^3 cubo y cada una de las n^2 de raíz.

    OriginalEl autor John

  7. 0

    Aquí está la solución sin usar Java en Matemáticas.función pow.
    Se le dará casi raíz enésima

    OriginalEl autor Vpn_talent

Dejar respuesta

Please enter your comment!
Please enter your name here