1

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

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 上,这种挂起会发生在浮点数的乘法重复中?

4

1 回答 1

3

正如文档所说,在 Erlang 中有两种比较术语相等性的操作,它们仅在处理整数和浮点数方面有所不同:

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

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

浮点数的另一个问题是它们的近似值。你永远不能确定你有一些精确的值,尤其是在算术运算之后。epsilon在浮点相等性测试中使用较小的值是一种常见的做法。

is_zero(F) -> (F < 1.0e-10) andalso (F > -1.0e-10).
于 2013-02-24T21:41:46.427 回答