我想结合模数执行动力操作。我在使用实数执行此pow()
函数时遇到问题。
这适用于整数:
pow(2,6000,400) = 176
但是,这会返回实数的错误:
pow(1.4142, 6000, 400)
我也尝试了math.pow()
功能,但它没有
工作要么......我怎么能用真实数字来处理这个?
答案 0 :(得分:2)
python函数pow()
接受2或3个参数。在您的情况下,pow(x,y,z)
执行x
次幂y
并对结果应用模z
。但是documentation是明确的:
如果第二个参数为负数,则第三个参数必须为 省略。如果存在z,则x和y必须是整数类型,并且y必须 是非消极的。
所以:
您的第一个电话可以正常工作,因为参数符合要求。请注意,尽管pow(2,6000)
是一个巨大的数字,但通过使用modular exponentiation整数上的属性,可以轻松计算组合模运算的结果而不会溢出。
第二次调用因错误而失败,因为第一个参数不是整数。解决方法是将您的操作分解为pow(1.4142,6000) % 400
,因为modulo是针对实数定义的。
不幸的是,pow(1.4142,6000)
太大而导致溢出错误。这是因为与C浮点编码范围无关的python整数相反,real numbers are limited。
P.S。:我认为这是关于python而不是VB,因为VB's pow()
只接受2个参数。
编辑:提示解决方法
这里有一个小的解决方法,它利用了这样一个事实,即从技术上讲,浮点数不是无限精度的数学实数,而是有理数。然后我们可以使用分子和分母并使用整数运算来掌握大数字:
n=pow(14142,6000) # take the first argument multiplied by a 10 exponent to make it an integer
d=pow(10000,6000) # keep track of this 10 exponent
i=n//d # integer division to compute the integral value
r=n-d*i # remainder of the integer division
precision=6 # precision
f=r*pow(10,precision)//d # keep the 6 most significant digits
result=(i%400)+(f/pow(10,precision))
结果是271.048181到第6位。我让你作为练习写一个以较少手工方式执行此功能的功能。