gpt4 book ai didi

javascript - Python 与 Javascript 浮点运算给出了截然不同的答案。我究竟做错了什么?

转载 作者:太空狗 更新时间:2023-10-29 17:48:44 25 4
gpt4 key购买 nike

Python version | Javascript version | Whitepaper

所以,我在一个网站上工作,计算两个玩家游戏的 Glicko 评级。它涉及很多浮点运算(平方根、指数、除法,所有讨厌的东西),出于某种原因,我得到的答案与我逐行翻译的算法的 Python 实现完全不同。 Python 版本基本上给出了原始白皮书中描述算法的示例的预期答案,但 Javascript 版本有很大偏差。

我在翻译时犯了错误还是 Javascript 的 float 学不太准确?

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。评级不太准确,方差更准确,两者都没有明显的原因。撞墙开始。

最佳答案

通常,当您减去两个相似的数字时,您会遇到这样的错误 - 然后值之间通常无关紧要的差异会被放大。例如,如果您有两个值,在 Python 中为 1.2345 和 1.2346,但在 JavaScript 中为 1.2344 和 1.2347,则差异分别为 1e-4 和 3 e-4(即一个是另一个的 3 倍)。

所以我会查看您的代码中有减法的地方并检查这些值。您可能会发现您可以 (1) 重写数学运算以避免减法(通常事实证明您可以找到一个以其他方式计算差异的表达式)或 (2) 关注为什么该特定点的值两种语言之间存在差异(也许另一个答案确定的 pi 差异正在以这种方式被放大)。

也有可能(虽然在这里不太可能)你有差异,因为某些东西在 python 中被视为整数,但在 javascript 中被视为 float 。在 python 中,整数和 float 是有区别的,如果你不小心,你可以做一些事情,比如将两个整数相除得到另一个整数(例如 3/2 = 1 在 python 中)。而在 javascript 中,所有数字都是“真正的” float ,因此不会发生这种情况。

最后,计算的执行方式可能存在细微差别。但这些都是“正常的”——要获得如此巨大的差异,您还需要像我上面描述的那样发生。

PS:另请注意 Daniel Baulig 在上面的评论中所说的参数 rd 的初始值。

关于javascript - Python 与 Javascript 浮点运算给出了截然不同的答案。我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6974625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com