我正在努力了解这个问题的原因。要点:
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上这种悬挂会出现浮点数的一些乘法重现?
答案 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).