2014-04-29 18 views
2


math.sqrt(2)結果似乎是不合理的,從而發生這種情況:的Lua - 全面提高一倍

> return math.sqrt(2) 
1.4142135623731 
> return math.sqrt(2) == 1.4142135623731 
false 

如何讓我這個「非理性」的變量一樣,如果我得到的變量不同的方式(如在上面的例子)?

+0

Lua中刪去了最後兩個數字故意隱瞞簡單的數字的「非理性」,這樣的作爲'(1/3)* 3' :) –

+0

爲什麼你需要使用'=='來完全相等的值?也許更容易一些(比如將數字重新設置爲固定精度的字符串或允許一些錯誤)可以滿足您的需求嗎? – hugomg

回答

4

該變量不是非理性的,它是浮點的,所以它甚至不是真實的。 (雖然2的平方根是不合理的,因此不能準確地表示它)

只需使用更多的數字作爲文字,並且往返轉換就可以工作。 IEEE雙精度浮點值需要17位十進制數字來安全地表示它,而不是14.

讓我們看看發生什麼事情時,我們採取數字1並提高它在最不重要的位。 (在「0X」是指數字是十六進制這使我更容易控制在這個例子中的位。):

x = 0x1.0000000000001 
> print(x == 1) 
false 
> print(('%.16g'):format(x)) 
1 
> print(('%.17g'):format(x)) 
1.0000000000000002