2012-09-07 24 views
3

在我的引擎中,我有一個用於編寫腳本的Lua VM。在腳本中,我寫的東西,如:將盧阿的數字與平等運營商進行比較有多安全?

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

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

按照Lua的來源,Lua中比較雙打,它使用的內部編號類型時使用一個簡單的等式操作符。

我知道處理浮點值時的精度問題,所以我想知道比較是否安全,也就是說,使用Lua的默認'=='操作簡單比較這些數字會有什麼問題嗎?如果是這樣,是否有任何對策可以用來確保1 + 2始終等於3?將值轉換爲字符串的工作?

+2

可能的重複[如果lua號碼是雙倍的,= = <=/> =操作總是正確的?](http://stackoverflow.com/questions/10526615/if-lua-number-is-double-does-operations-始終是正確的) –

回答

2

我可以用來確保1 + 2總是比較等於3嗎?

You needn't worry. Lua中號碼類型爲double,能容納更多的整數正好比一個'長int``。

+0

所以我保證n + m == q的運算對於雙精度來說總是正確的(其中n,m和q是整數值,並且q <100 )? – GhassanPL

+0

是的,其中q <4503599627370496(即,4.5萬億)。 – Mud

+0

並且'tonumber(「5」)'調用會給我一個可以安全地用於整數算術的值嗎? – GhassanPL

1

雙打比較和基本操作在某些情況下是安全的。特別是如果數字及其結果可以精確表達 - 包括所有低值整數。

所以2+1 == 3將罰款雙打。

注:我相信有甚至一些擔保,某些數學函數(如powsqrt),如果你的編譯器/庫尊重那些然後sqrt(4.0)==2.04.0 == pow(2.0,2.0)將可靠地是真實的。

0

默認情況下,Lua使用C++浮點編譯,幕後編號比較歸結爲c/C++中的浮點數比較,這確實存在問題,並在幾個線程中討論過。 most-effective-way-for-float-and-double-comparison

Lua通過將所有數字(包括C++整數)轉換爲浮點數來使情況稍微惡化。所以你需要記住它。

6

可能如果你只關心在某些情況下的平等,轉換爲字符串,然後比較結果會更好。例如:

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

我瞭解到這款硬盤的方式,當我給我的學生用這些數字(0.07〜300)的分配,並要求他們實現一個單元測試,然後悲慘地失敗了,抱怨21不等於21(它比較實際的數字,但顯示字符串化的值)。這是我們討論比較浮點值的一個很好的理由。

+0

這個例子就是爲什麼在計算值上使用math.floor()的原因,因爲精度可能是一個問題,並不重要。 –

+0

是的,那是我們討論的選項之一...... –