2015-08-15 60 views

回答

45

如果你想要一个整数使用Erlang :math module

:math.pow(2,3) #=> 8.0 

:math.pow(2,3) |> round #=> 8 
41

Erlang的:math.pow有一定的局限性,例如它不会允许真正的高整数功率:

iex(10)> :math.pow(2, 10000) 
** (ArithmeticError) bad argument in arithmetic expression 

您可以轻松地重新实现了计算能力的快速算法,将与由运行时提供的任意大整数的工作:

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... 
3

下面是幂函数的尾调用优化的实现:

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) 
+0

非常好!用这个Erlang翻译代替':math.pow'的当前实现将会很好。 https://github.com/erlang/otp –

+0

当前:math.pow实现是一个NIF我想,是不是? – markusheilig