怪了, Python 算出来的组合的结果为什么是错的

2019-04-17 19:07:11 +08:00
 hakono

就是高中数学的那个排列组合的组合,C。从 n 样东西里,取出 m 样,计算有几种取法

就是那个组合的 nCm

公式写出来就是 n!/( (n-m)!*m! )

wiki 介绍


然后我用 python 算了下,发现结果和其他语言算出来不一样 比如 n=64, n=32( 从 64 样里取出 32 个),用mathematica来算,得到的结果是:

1832624140942590534

有兴趣可以访问wolframalpha 这里看看我输入的公式

而如果用 python 来算,无论是调用科学计算包scipy还是直接自己写函数,算出的结果都是:

1832624140942590464

from scipy.special import comb

print("%d" % comb(64,32))

输出:1832624140942590464

如果自己实现计算函数的话也是算出来

1832624140942590464

有的搞不懂哪里出的问题

2172 次点击
所在节点    Python
3 条回复
ayase252
2019-04-17 19:21:26 +08:00
https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.special.comb.html
comb 有个默认为 false 的 extra 参数,会用浮点数去算,改成 true 就对了
wheeler
2019-04-17 19:22:04 +08:00
https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.comb.html#scipy.special.comb

Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from scipy.special import comb
>>> comb(64,32, exact=True)
1832624140942590534
>>>
hakono
2019-04-17 21:50:01 +08:00
@ayase252
@wheeler
原来如此,感谢解答,原来是精度问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX