2

ご存知のように、浮動小数点には精度の問題があります。つまり、値1は0.9999999になります。そして、luaはCで==を使用して、2つのdoubleの数値が等しいかどうかを確認します。したがって、問題は次のとおりです。

a = 5.6
b = 14 * 0.4
print(a==b) ; => false

しかし、もっと悪いことは:

a = 1
...
if a < 1 then print("<1") end ; => sometimes a < 1 

では、どうすればこれを回避できますか?luaのソースコードを確認しました。luaconf.hのluai_numeq/luai_numle)マクロを変更できるようですが、これは必要ですか?

アップデート

2番目の例は実際には正しくありません。実際のところ、私の問題は、lua_tonumberを使用して値を取得するc / c ++に値1を渡し、この値をdouble変数に格納し、しばらくしてから、値(lua_pushnumber)をluaにプッシュします。起こりました:

in lua:
my_cfunction(1)
...
in c:
int my_cfunction(lua_State *L) {
    double val = lua_tonumber(L, 1);
    ...
...
lua_pushnumber(L, val);

in lua:
local a = my_cfunction2()
if a < 1 then ... end
4

2 に答える 2

5

ご存知のように、浮動小数点には精度の問題があります。つまり、値1は0.99999999になります。

まったくわかりません。それは真実ではないからです。1.0は1.0です。これ:

a = 1
if a < 1 then print("<1") end

「<1」は出力されません。実際に変更しない限り、そうではありませんa。これでも:

a = 2
a = a - 1
if a < 1 then print("<1") end

print同様に、ステートメントにヒットすることはありません。

Luaの数値に対して整数演算を実行している限り、最終的に整数になります。整数値の加算、減算、または乗算によって、整数以外の数値が残ることはありません。

于 2012-05-10T02:12:18.590 に答える
4

浮動小数点には精度の問題があります

そうではありません。

64ビットのdoubleは、32ビットの整数よりもはるかに多くの整数値を正確に保持できます。

于 2012-05-10T02:32:39.040 に答える