当分解浮点而不是整数时系统挂起

时间:2013-02-24 14:09:31

标签: erlang

我正在努力了解这个问题的原因。要点:

1)将整数(10)传递给以下分解函数立即起作用:

test() ->
    X  = 10,
    F  = factorize(X).

factorize(0) -> 1;
factorize(N) -> N * factorize(N-1).

2)传递浮动( 10.0 )将导致光束进程挂起,占用高CPU但甚至无法终止。 请注意,这是一个小值。我可以将一个高整数分解并得到一个几乎立即的响应,但一个小的浮点数10.0将导致它挂起。

test() ->
    X  = 10.0,          <-- NOTICE THE DOT ZERO 10.0
    F  = factorize(X).

factorize(0) -> 1;
factorize(N) -> N * factorize(N-1). 

问题:为什么在Erl Earth上这种悬挂会出现浮点数的一些乘法重现?

1 个答案:

答案 0 :(得分:3)

As documentation says,有两个比较Erlang中术语相等的操作,它们只在处理整数和浮点数方面有所不同:

  • =:= - 完全相同 - 如果类型相同则计算数字相等,且它们的值也相同false = (0.0 =:= 0)
  • == - 相等 - 如果数值相同但数字可能不相等,则数字相等true = (0.0 == 0)

模式匹配使用第一个 - 完全相等 - 运算符,这就是你的函数在第二个子句中被绞死的原因。

浮点数的另一个问题是它的近似值。你绝对不能确定你有一些确切的值,特别是在算术运算之后。通常的做法是在浮点数相等测试中使用小值epsilon

is_zero(F) -> (F < 1.0e-10) andalso (F > -1.0e-10).