在python中是否有Perl的大浮点数据类型的等价物?如果我用python做阶乘(500)

2024-04-26 18:54:12 发布

您现在位置: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似乎可以执行非常高精度的算法。但是商

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

接近准确答案,但有点短?你知道吗

有没有一种方法可以从python中得到上述表达式的精确答案?你知道吗


Tags: 方法答案算法定义表达式原因perlint
1条回答
网友
1楼 · 发布于 2024-04-26 18:54:12

Python的int对象可以根据需要变大(仅取决于可用内存的大小),因此它们可以用于涉及大量数据的计算。在Python2中,有两种整数类型intlong,其中int用于适合机器整数的值,但在Python3中,它们被合并为一种int类型。你知道吗

Python没有内置的BigFloat类型,但是标准库有^{}模块,它可以执行基本的算术运算,包括平方根运算,达到任何所需的精度。如果您需要使用更多函数进行任意精度的数学运算,请参阅优秀的第三方库^{}。你知道吗

在计算二项式系数时,可以安全地使用//楼层除法,因为分母中的项可以保证除以分子。例如

from math import factorial

a = (factorial(500) // factorial(490)) // factorial(10)
print(a)

输出

245810588801891098700

然而,用一个简单的循环来计算二项式系数可能比计算那些巨大的阶乘更有效。你知道吗

def binomial(n, r):
    ''' Binomial coefficients '''
    if not 0 <= r <= n:
        return 0
    p = 1
    r = min(r, n - r)
    for i in range(1, r+1):
        p *= n
        p //= i
        n -= 1
    return p

# Test

print(binomial(500, 10), '\n')

for i in range(10):
    print([binomial(i, j) for j in range(i+1)])

输出

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]

相关问题 更多 >