2012-05-10 5 views
2

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

これは、異なる基数(つまり、基底2から基底10)に変換すると、浮動小数点演算で「問題」となります。それに慣れる。その周りのプログラム。間違いなく、言語ソースをハックしないでください。 1つは、移植性のないコードです。例2で何が起きているのか分からない。私はあなたのケースは非常にありそうもないと思う... 1 <1の場合、私はバージポールでLuaに触れません。 – spender

+1

可能な複製http://stackoverflow.com/questions/6366954/why-is-lua-arithmetic-is-not -equal-to-itself – lhf

+0

私はあなたが何か間違っていると思う。オーバーフローしないLuaの整数値の算術演算は常に正確でなければなりません(LuaはCの "double"型を使用しますが、オーバーフローしない整数値で動作する場合はIEEE浮動小数点が正確です)。そうでないと思われるテストケースが実際にある場合は、_complete_テストケースを含めてください。コードスニペットでは不十分です。 – snogglethorpe

答えて

4

フロート点は64ビット倍精度問題

It doesn't.

を有する正確32ビット整数よりも多くの整数値を保持することができます。

5

ご存知のように、フロートポイントは精度の問題を抱えている、それが値1は、私は全く知りません0.9999999

になりますです。それは本当ではないので。 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文を打つことは決してありません。

ルアの数値で整数演算を実行している限り、整数になります。整数値の加算、減算、または乗算は、整数でない数値になります。

関連する問題