3

私のエンジンには、スクリプト用のLuaVMがあります。スクリプトでは、次のように記述します。

stage = stage + 1
if (stage == 5) then ... end

objnum = tonumber("5")
if (stage == objnum)

Luaの情報源によると、Luaは、使用する内部数値タイプであるdoubleを比較するときに、単純な等式演算子を使用します。

浮動小数点値を処理するときの精度の問題を認識しているので、比較が安全かどうか、つまり、Luaのデフォルトの「==」操作を使用してこれらの数値を単純に比較することに問題があるかどうかを知りたいですか?もしそうなら、1 + 2が常に3に等しいことを確認するために採用できる対策はありますか?値を文字列に変換することはできますか?

4

4 に答える 4

11

場合によっては平等だけを気にする場合は、文字列に変換してから結果を比較する方がよい場合があります。例えば:

> print(21, 0.07*300, 21 == 0.07*300, tostring(21) == tostring(0.07*300))
21      21      false   true

生徒にこれらの数値(0.07と300)を割り当てて、21が21と等しくない(実際の数値を比較しているが、文字列化された値を表示している)と不平を言ってユニットテストを実装するように依頼したときに、この難しい方法を学びました。 )。浮動小数点値の比較について議論するのは良い理由でした。

于 2012-09-07T15:12:44.317 に答える
2

1 + 2が常に3に等しいことを確認するために採用できますか?

You needn't worry. The number type in Lua is double, which can hold many more integers exactly than a long int.

于 2012-09-08T04:23:01.927 に答える
1

ダブルスの比較と基本操作は、特定の状況では安全です。特に、数値とその結果を正確に表現できる場合は、すべての低い値の整数を含みます。

したがって2+1 == 3、ダブルスには問題ありません。

pow注:特定の数学関数(およびなど)にはいくつかの保証がありsqrt、コンパイラ/ライブラリがそれらを尊重する場合、sqrt(4.0)==2.0または4.0 == pow(2.0,2.0)確実に真になると思います。

于 2012-09-07T11:16:18.633 に答える
1

デフォルトでは、Luaはc ++ floatでコンパイルされ、舞台裏では、数値比較はc / c ++でのfloat比較に要約されます。これは実際に問題があり、いくつかのスレッドで説明されています。 -比較

Luaは、c ++整数を含むすべての数値を浮動小数点数に変換することにより、状況をわずかに悪化させます。したがって、それを覚えておく必要があります。

于 2012-09-07T14:08:03.663 に答える