簡體   English   中英

Python vs Javascript浮點算法給出了非常不同的答案。 我究竟做錯了什么?

[英]Python vs Javascript floating point arithmetic giving very different answers. What am I doing wrong?

Python版本 | Javascript版本 | 白皮書

所以,我正在一個網站上計算兩個玩家游戲的Glicko評級。 它涉及很多浮點運算(平方根,指數,除法,所有令人討厭的東西),我出於某種原因得到了一個完全不同的答案,從我逐行逐行翻譯的算法的Python實現。 Python版本基本上給出了描述算法的原始白皮書中的示例的預期答案,但Javascript版本相當有點偏差。

我在翻譯中出錯了還是Javascript的浮點數學不太准確?

Expected answer: [1464, 151.4]
Python answer: [1462, 155.5]
Javascript answer: [1470.8, 89.7]

所以評級計算並不差,准確度為99.6%,但方差偏差為2/3!

編輯:人們已經指出Pyglicko版本中RD的默認值是200.這是原始實現者離開測試代碼我認為的情況,因為測試用例是在RD為200的人上完成的,但是顯然默認值應該是350.但是,我在Javascript的測試用例中指定了200,所以這不是問題。

編輯:更改算法以使用map / reduce。 評級不太准確,方差更准確,兩者都沒有明顯的原因。 Wallbanging開始了。

通常你會得到這樣的錯誤,你減去兩個相似的數字 - 那么值之間通常無關緊要的差異就會被放大。 例如,如果在python中有兩個值為1.2345和1.2346,而在javascript中有1.2344和1.2347,則差異分別為1e-4和3 e-4(即一個是另一個的3倍)。

所以我會看看你的代碼中有減法的地方並檢查這些值。 你可能會發現你可以(1)重寫數學以避免減法(通常事實證明你可以找到一個以某種其他方式計算差異的表達式)或(2)關注為什么這個特定點的值這兩種語言之間存在差異(也許是通過這種方式放大了另一個答案所確定的差異)。

雖然在這里不太可能,但你也有可能因為某些內容在python中被視為一個整數而在javascript中被視為一個浮點數。 在python中,整數和浮點數之間存在差異,如果你不小心你可以做一些事情,比如將兩個整數除以得到另一個整數(例如python中的3/2 = 1)。 而在javascript中,所有數字都是“真正的”浮動,所以這不會發生。

最后,計算的執行方式可能存在細微差別。 但這些都是“正常的” - 要獲得如此劇烈的差異,你需要像我上面所描述的那樣發生。

PS:還要注意Daniel Baulig在上述評論中對參數rd的初始值所說的內容。

我的猜測是涉及你用於JavaScript版本中某些常量的近似值。 特別是你的pi2似乎有點......簡短。 我相信Python正在為這些值使用雙打。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM