Come posso calcolare un numero con un esponente in elisir?Come elevare un numero a un potere in elisir?
Ad esempio, 2 sarebbero tornati 8.
Come posso calcolare un numero con un esponente in elisir?Come elevare un numero a un potere in elisir?
Ad esempio, 2 sarebbero tornati 8.
:math.pow(2,3) #=> 8.0
Se si desidera un numero intero:
:math.pow(2,3) |> round #=> 8
Erlang di :math.pow
ha alcune limitazioni, per esempio non consentirà i poteri interi molto alti:
iex(10)> :math.pow(2, 10000)
** (ArithmeticError) bad argument in arithmetic expression
Si può facilmente reimplementare un algoritmo veloce per potenze di calcolo che funzionerà con i arbitrariamente grandi numeri interi forniti dal runtime:
defmodule Pow do
require Integer
def pow(_, 0), do: 1
def pow(x, n) when Integer.is_odd(n), do: x * pow(x, n - 1)
def pow(x, n) do
result = pow(x, div(n, 2))
result * result
end
end
iex(9)> Pow.pow(2, 10000)
19950631168807583848837421626835850838234968318861924548520089498529438830...
Ecco una chiamata coda ottimizzata implementazione della funzione di potenza:
def pow(n, k), do: pow(n, k, 1)
defp pow(_, 0, acc), do: acc
defp pow(n, k, acc), do: pow(n, k - 1, n * acc)
Molto bello! Sarebbe bello sostituire l'implementazione attuale di ': math.pow' con una traduzione Erlang di questo. https://github.com/erlang/otp –
corrente: l'implementazione math.pow è un NIF penso, non è vero? – markusheilig