Aus*_*Yun 12 javascript python floating-point
Python版本 | Javascript版本 | 白皮书
所以,我正在一个网站上计算两个玩家游戏的Glicko评级.它涉及很多浮点运算(平方根,指数,除法,所有令人讨厌的东西),我出于某种原因得到了一个完全不同的答案,从我逐行逐行翻译的算法的Python实现.Python版本基本上给出了描述算法的原始白皮书中的示例的预期答案,但Javascript版本相当有点偏差.
我在翻译时出错了还是Javascript的浮点数学不太准确?
Expected answer: [1464, 151.4]
Python answer: [1462, 155.5]
Javascript answer: [1470.8, 89.7]
Run Code Online (Sandbox Code Playgroud)
所以评级计算并不差,准确度为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的初始值所说的内容.
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |