有Perl'的等价物吗;python中的大浮点数据类型是什么?如果我在python中执行阶乘(500)

有Perl'的等价物吗;python中的大浮点数据类型是什么?如果我在python中执行阶乘(500),python,combinations,factorial,Python,Combinations,Factorial,Python中是否有与Perl的BigFloat数据类型等效的数据类型?我问的原因是我想用它的定义n来计算nCk/k*(n-k) 对于Perl的BigFloat数据类型,根据定义进行计算可以正确地用于任何n和k。比如说 阶乘(500)/阶乘(10)*阶乘(490) 当n和k是大浮点时,生成精确答案 在Python中,factorial(500)和factorial(10)*factorial(49)都使用Python对int使用的任何方法给出确切的答案。因此,python似乎可以执行非常高精度的

Python中是否有与Perl的BigFloat数据类型等效的数据类型?我问的原因是我想用它的定义n来计算nCk/k*(n-k)

对于Perl的BigFloat数据类型,根据定义进行计算可以正确地用于任何n和k。比如说

阶乘(500)/阶乘(10)*阶乘(490)

当n和k是大浮点时,生成精确答案

在Python中,factorial(500)和factorial(10)*factorial(49)都使用Python对int使用的任何方法给出确切的答案。因此,python似乎可以执行非常高精度的算法。然而商

整数(阶乘(500)/(阶乘(10)*阶乘(490))

接近准确答案,但有点短


有没有一种方法可以从python中获得上述表达式的精确答案?

python的
int
对象可以根据需要增长(仅取决于可用内存的大小)在Python 2中,有两种整数类型,
int
long
,其中
int
用于适合机器整数的值,但在Python 3中,它们被合并为一种
int
类型

Python没有内置的BigFloat类型,但标准库中有一个模块,可以将基本算术(包括平方根)运算到任何所需的精度。如果您需要使用更多函数进行任意精度的数学运算,请参阅优秀的第三方库


在计算二项式系数时,您可以安全地使用底除法,因为分母中的项保证除以分子

从数学导入阶乘
a=(阶乘(500)//阶乘(490))//阶乘(10)
印刷品(a)
输出

245810588801891098700
245810588801891098700 

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

然而,用一个简单的循环计算二项式系数可能比计算那些巨大的因子更有效

def二项式(n,r):
“二项式系数”

如果不是0,则不使用除法,使用底数除法。如果不使用乘法,则使用2个除法。
factorial(500)/factorial(490)
只是
491*492*493*494*495*496*497*498*499*500
。不需要大浮点数。@Eric,我知道快捷方式,但我的问题确实与如何正确处理大浮点数有关。我碰巧使用了一个特殊的双精度系数作为更一般情况的示例。谢谢,//运算符正是我需要的。我没有o在我刚刚学习Python时了解它。我的方法是将我在C和Perl中所做的东西转换成Python。@nog642感谢您修复了Python 2/Python 3的打字错误,但是
factorial(500)//factorial(490)//factorial(10)
factorial(500)//(factorial(490)*factorial(10)更有效一些
,这就是我在对这个问题的评论中提出的原因。但是,我添加了额外的括号,以使其更具可读性。“在计算二项式系数时,您可以安全地使用
/
底除法,因为分母中的项保证会除以分子。”两次除法都是这样吗?显然第一次除法是正确的,因为最高阶乘更高,但第二次除法也有保证吗?@adrio是的,是的。你可以用数学归纳法证明一个连续的
n
整数序列总是可以被
n!
整除。这就是为什么我的循环版本工作正常。