2012-04-26 58 views

回答

1

雖然ECMAScript語言規範5.1版指出,數字對應IEEE 754個浮動,這意味着計算的原始值應該是一致的

http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf

4.3.19號值

原始值對應於雙精度64位二進制格式IEEE 754值

備註 數字值是數字類型的成員,並且是數字的直接表示形式。

由於BlueRaja指出,存在部分15.8.2一種告誡的:

功能ACOS的行爲,ASIN,ATAN,ATAN2,COS,EXP,日誌, 戰俘,罪惡,開方,棕褐色不正是在這裏指定...

意義,這些都是至少某些情況下,操作對數字結果是實現相關的,因此可能是不一致的。

+0

我沒有任何特定的代碼,只是想知道... – 2012-04-26 13:55:55

+2

不正確。看到我的答案。 – 2012-04-26 21:50:48

+0

這個答案不正確。即使x和y相同,同一臺機器也可以爲像x + y這樣的操作返回不同的結果。 BlueRaja的答案是正確的。 – lacker 2012-05-04 19:00:05

3

如果我們假設每個瀏覽器供應商都遵循標準+ ECMA規範並且在實施時沒有人爲錯誤,那麼不會有任何區別。

+0

是啊,如果他們遵守標準,他們都表現在標準的方式。無論如何,不​​符合IEEE/ECMA的瀏覽器可能都不值得使用。 – Romain 2012-04-26 13:50:28

+0

啊,現在你已經添加了「ECMA」,我可以刪除我的答案,並upvote你的。 =)讀者的更多信息:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf指定了所有ECMAscript數字必須如何表現,通常根據各種IEEE規範。 – ninjagecko 2012-04-26 13:52:29

+0

錯誤。看到我的答案。 – 2012-04-26 21:50:56

11

其他回答都是錯誤的。按照ECMAScript 5.1 specs(第15.8.2)

注意的功能ACOS,ASIN,ATAN,ATAN2,COS,EXP, 日誌,戰俘,罪惡,開方,棕褐色不正是在此規定的行爲 除外,要求對某些代表值爲 的感興趣邊界案例的參數值進行特定結果。

...

雖然算法的選擇是 留給實現,建議(但不是以 本標準規定),其實現使用包含在fdlibm的IEEE 754算法的近似算法 ,來自Sun Microsystems


然而,自由分派 數學庫,即使實現分別爲指定,全部爲的確切結果仍然依賴於瀏覽器/體系結構。 這包括簡單的操作,如乘法和除法!

原因是IEEE-754允許系統在higher-precision than the result上執行64位浮點計算,從而導致與使用與結果相同的精度的系統導致不同的舍入結果。這正是x86 (Intel) architecture does,這就是爲什麼在C(和JavaScript)我們有時可以有cos(x) != cos(y) even though x == y,即使在同一臺機器上!

這是一個big issue for networked peer-to-peer games,因爲這意味着,如果更高的精度計算不能被禁用(如對於C#的情況下),這些遊戲幾乎不能使用浮點計算在所有。但是,這通常不是Javascript遊戲的問題,因爲它們通常是客戶端服務器。

+0

偉大的文章 - 但:通常(因爲不精確)使用==或!=與浮游物不是一個好主意。然而,這並不意味着你不能使用浮點數,它只是意味着,不要使用==或!=,而是使用比較<= > =針對任何精度定製的範圍。 – delicateLatticeworkFever 2012-04-26 21:58:47

+0

@goldilocks是正確的,事實上(Math.tan(1)== Math.sin(1)/Math.cos(1))產生false ... – 2012-04-27 11:58:23

+1

@João:是的,但是這與您的問題是正交的。每個人都知道,由於浮點不準確,我們可能有'tan(1)!= sin(1)/ cos(1)'。問題不在於它們是否相等,而在於所有瀏覽器/機器中的tan(x)'對於某些'x'總是完全相同。答案仍然是否定的,但與浮點不準確無關 - 這是因爲'tan(x)'沒有在javascript中精確定義,並且因爲IEEE-754允許擴展精度計算。如果這兩件事情不是真的,答案會是肯定的,它總是一樣的。 – 2012-04-27 14:49:02

0

我的兩分錢 - @goldilocks筆記和其他人暗示你不應該在浮點數上使用==或!=。那麼,「確定性」是什麼意思?在不同的機器上行爲總是一樣的?顯然這取決於你所說的「同樣的行爲」。

那麼,在「相同」的愚蠢文字層次上,當然不是,物理位在例如「 32位與64位機器。所以這個解釋就沒有了。

好吧,任何程序在兩臺不同的機器上運行相同的輸出?在一般的語言中不可以,因爲C程序可以對未定義的內存做一些事情,比如從未初始化的位讀取。

好吧,那麼有效程序在不同的機器上做同樣的事情?那麼,我會說在浮點數上使用==和!=的程序與讀取未初始化內存的程序一樣無效。我個人不知道Javascript標準是否會拋出==和!=在浮點數上的行爲,以至於如果不是kooky,它的定義非常明確,所以如果這是您確切的問題,您將不得不看到其他答案。你可以編寫相對於標準而言未定義輸出的JavaScript代碼嗎?不要閱讀標準(其他答案在某種程度上涵蓋了這一點),但出於我的興趣,這是沒有實際意義的,因爲那些會產生你所謂的不確定行爲的程序是無效的。