ご存知のように、浮動小数点には精度の問題があります。つまり、値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