Pregunta

Su disponible para mí sólo log (base "e"), el pecado, (sólo la raíz cuadrada) bronceado y sqrt funciones y los operadores aritméticos básicos (+ - * / mod). Tengo también la "e" constante.

Estoy experimentando varios problemas con diluvio (zoho.com) para estas restricciones. Debo implementar exponenciación de bases y exponentes racionales (fracción).

¿Fue útil?

Solución

Decir que desea calcular pow(A, B)

Tenga en cuenta la representación de B en base 2:

B = b[n]   * pow(2, n    ) +
    b[n-1] * pow(2, n - 1) +
    ...
    b[2]   * pow(2, 2    ) +
    b[1]   * pow(2, 1    ) +
    b[0]   * pow(2, 0    ) +
    b[-1]  * pow(2, -1   ) +
    b[-2]  * pow(2, -2   ) +
    ...

 = sum(b[i] * pow(2, i))

donde b[x] puede ser 0 o 1 y pow(2, y) es una potencia entera de dos (es decir, 1, 2, 4, 1/2, 1/4, 1/8).

A continuación,

pow(A, B) = pow(A, sum(b[i] * pow(2, i)) = mul(pow(A, b[i] * pow(2, i)))

Y así pow(A, B) se puede calcular utilizando únicamente las multiplicaciones y las operaciones de raíz cuadrada

Otros consejos

Si usted tiene una función F () que hace e ^ x, donde e es la constante, y x es cualquier número, entonces usted puede hacer esto: (a es la base, b es el exponente, ln es log-e)

a ^ b = F (b * ln (a))

Si usted no tiene F () que hace e ^ x, entonces se vuelve más complicado. Si el exponente (b) es racional, entonces debería ser capaz de encontrar enteros m y n para que b = m / n, usando un bucle de algún tipo. Una vez que tenga m y n, que hacer otro bucle que multiplica una por sí sola M veces para conseguir un ^ M y luego múltiplos una por sí mismo n veces para tener una ^ n, y se divide a ^ m / a ^ n para obtener una ^ (m / n), que es a ^ b.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top