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 では、 float の単純な乗算の繰り返しでこのハングが発生するのでしょうか?

4

1 に答える 1

3

ドキュメントにあるように、Erlangの用語の同等性を比較するための2つの操作があり、それらは整数と浮動小数点数の処理のみが異なります。

  • =:=-完全に等しい-タイプが同じで、それらの値も同じである場合、数値は等しいと見なされますfalse = (0.0 =:= 0)
  • ==--equal-値が同じであるがタイプが等しくない場合は、等しい数をカウントしますtrue = (0.0 == 0)

パターンマッチングでは、最初の演算子(完全に等しい演算子)が使用されます。そのため、関数は2番目の句でハングしました。

フロートに関するもう1つの問題は、概算値です。特に算術演算の後で、正確な値があることを確認することはできません。epsilonフロート等式テストで小さな値を使用する一般的な方法があります。

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