ご存知のように、浮動小数点は精度問題があります。つまり、値1は0.9999999になります。そして、2つの倍数が等しいかどうかを調べるために、Cで==を使う。ルアの数値が2倍の場合、=/<=/> =操作は常に正しいですか?
a = 5.6
b = 14 * 0.4
print(a==b) ; => false
しかし、より悪い事は次のとおりです:だから問題がある
a = 1
...
if a < 1 then print("<1") end ; => sometimes a < 1
それでは、どのように私はこれを避けることができますか?私はluaソースコードをチェックします、luacon_.hのluai_numeq/luai_numle)マクロを修正することができますが、これは必要ですか?
更新
第二の例は本当に正しいではありません。実際には私の問題は、値1をc/C++に渡してlua_tonumberを使って値を取得し、この値を二重変数に格納し、いつかluaに値(lua_pushnumber)をプッシュし、< 1起こっ:
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
これは、異なる基数(つまり、基底2から基底10)に変換すると、浮動小数点演算で「問題」となります。それに慣れる。その周りのプログラム。間違いなく、言語ソースをハックしないでください。 1つは、移植性のないコードです。例2で何が起きているのか分からない。私はあなたのケースは非常にありそうもないと思う... 1 <1の場合、私はバージポールでLuaに触れません。 – spender
可能な複製http://stackoverflow.com/questions/6366954/why-is-lua-arithmetic-is-not -equal-to-itself – lhf
私はあなたが何か間違っていると思う。オーバーフローしないLuaの整数値の算術演算は常に正確でなければなりません(LuaはCの "double"型を使用しますが、オーバーフローしない整数値で動作する場合はIEEE浮動小数点が正確です)。そうでないと思われるテストケースが実際にある場合は、_complete_テストケースを含めてください。コードスニペットでは不十分です。 – snogglethorpe