当前位置: 首页 > 知识库问答 >
问题:

当分子和分母都很大时,如何避免python中的溢出

韩寂离
2023-03-14
from operator import mul    
from fractions import Fraction
import math

n = 5000

def nCk(n,k): 
  return int( reduce(mul, (Fraction(n-i, i+1) for i in range(k)), 1) )

p = 2.884e-5
totP = 0
sgn = 1

print "n: " + str(n)
for r in range(1, n):
    numTerms = nCk(n,r) - ((2*n-3)*(r-1))
    totP += sgn * (p ** r) * numTerms
    sgn *= -1

print "total = " + str(totP)

当我开始增加n:overflowerrror:long int太大而无法转换为float时,我得到了一个溢出错误

Num条款项变得非常大,而p^r项变得非常小。基本上,我有一个大分子除以一个大分母。对如何计算这个有什么建议吗?我想过用对数和斯特林近似公式来表示n!无济于事。任何帮助将不胜感激!

共有3个答案

黄元章
2023-03-14

我最终使用了scipy。杂项。当浮动值达到“Inf”时,梳功能和设置上限。

吕志诚
2023-03-14

要处理大精度,可以使用十进制库:

import decimal
decimal.getcontext().prec = 100 #Or whatever precision you want...
...
p = decimal.Decimal(2.884e-5)
...

虽然代码很慢,但它在我的电脑上没有停止...

终于完成了,并且意识到:你打印出str(p),并且你永远不会改变它...也许你是说top

汪明德
2023-03-14

如果您可以容忍精度的轻微损失,那么可以使用对数来完全避免除法步骤。根据定义,a/b等于exp(log(a)-log(b))。这适用于非常广泛的输入,没有过流或下流。

要把它放在原始代码的上下文中,您必须:

return int( reduce(mul, (Fraction(n-i, i+1) for i in range(k)), 1) )

您要申请的替换是:

[1] a*b --> exp(log(a)+log(b))
[2] c/d --> exp(log(c)-log(d))

所以我相信你的重铸函数应该是这样的:

from operator import add
from math import exp, log
...

return int( exp(reduce(add, (log(n-i)-log(i+1) for i in range(k)), 1)) )
 类似资料:
  • 问题内容: 我有一个带有两列的pandas数据框:x和value。我想查找x == 10的所有行,并为所有这些行设置值= 1,000。我尝试了下面的代码,但收到警告 我知道我可以通过使用.loc或.ix来避免这种情况,但是我首先需要找到满足x == 10的条件的所有行的位置或索引。有没有更直接的方法? 谢谢! 问题答案: 您应该使用以确保您正在使用视图,在您的示例中以下内容将起作用并且不会发出警告

  • 问题内容: 我已经在C中实现了一些排序算法(用于对整数进行排序),并谨慎地用于存储与数据大小有关的任何内容(因此还包括了计数器和填充物),因为该算法也应使用数千兆字节的数据集进行测试整数 这些算法应该很好,并且分配的数据量应该没有问题:数据存储在文件中,并且每次仅加载很少的块,即使将内存中的缓冲区阻塞为任意大小,也可以正常工作。 使用数据集最多4千兆字节(因此16GB数据)的测试可以正常工作(排序

  • 我是一个高中学生,我们有一个项目,创建一个计算器,其中一个任务是改变消息“无限”为“未定义”,有什么建议吗?

  • 我被困在编写Python Selenium脚本中,似乎无法令人满意地解决我得到的这个StaleElementReistrceException。 我加载了我的页面,然后单击一个按钮,打开一个表单,允许用户向订单中添加新的信用卡。在这一点上,我做了一个WebDriverWait来暂停脚本,直到这个表单上的Save按钮变为可见。此时,重新创建页面对象,因为它已更改,我的目的是填充字段并保存卡片。 问题

  • 我正在尝试正确地使用ByteBuffer和BigEndian字节顺序格式。。 我有几个字段,我试图把它存储在Cassandra数据库之前放在一个单一的ByteBuffer中。 我将要写入Cassandra的字节数组由三个字节数组组成,如下所述- 现在,我需要快速压缩attributeValue数据,然后再将其存储在Cassandra中- 现在,我将编写,和snappy压缩的一起组成一个单字节数组,

  • 我一直有一些与导航KML DOM相关的性能问题,我从Web服务器上的KMZ文件(使用的是ftchKml)获得。我正在使用这里描述和讨论的gex.dom.walk方法: https://developers.google.com/earth/articles/domtraversal http://code.google.com/p/earth-api-utility-library/wiki/GE