[英]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.