Python - 具有大整数的精度损失

时间:2014-07-12 02:10:16

标签: python int multiplication

修改

工作!!!谢谢各位的意见! // =在函数中需要从2.x移植到3.x

我试图及时在Python中考虑非常大的数字。这是有效的,除非素数值与原始值相乘时存在很大的差异。

代码:

import math

x = 4327198439888438284329493298321832193892183218382918932183128863216694329


def getPrimes(n):
    num = abs(n)
    factor = 2
    primes = []
    while num > 1:
        factor = getNext(num, factor)
        primes.append(factor)
        num /= factor
    if n < -1:
        primes[0] = -primes[0]
    return primes

def getNext(n, f):
    if n % 2 == 0:
        return 2
    for x in range(max(f, 3), int(math.sqrt(n) + 1), 2):
        if n % x == 0:
            return x
    return n

values = getPrimes(x)

orig = int(1);

print(values)
for y in values:
    orig *= int(y)

print("\n") 
print(x)
print("\n")
print(orig)
print("\n")
print(orig-x)

输出:

[17, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 83, 20845357395553.0]


4327198439888438284329493298321832193892183218382918932183128863216694329


4327198439888438374354383059307859040070974971297410068584490149575917568


90024889760986026846178791752914491136401361286359223239

???

当将原始数字分开时,它能够很好地达到一个主要因素。这使我确信我在上述分解中得到的因素是正确的。

>>> x /= 17
>>> x /= 20845357395553
>>> x /= (2**185)
>>> x /= 3
>>> x
83.0
>>> x /= 83
>>> x
1.0
>>>

TL; DR

我相信python的代码在大数(int)乘法时有错误,或者我做了一些绝对疯狂的事情,理智检查!

谢谢!

修改

我在一个在线python解释器中做了第二个示例代码,特别是2.xx而不是3.xx但是我确实在3.x中运行了代码,正如你们中的一些人所说的那样。在3.xx中重写第二个操作并替换。不知道是否有人回答为什么代码有两个单独的值应该是相同的。

编辑 - 2014年7月12日

经过进一步检查后,似乎我有一个案例,其中因素不正确(与Wolfram Alpha核实)并且我已经切换了算法。我将在2.7以后长期测试。

1 个答案:

答案 0 :(得分:4)

Python3 has changed what the division operator does

在Python 2中:

>>> 3 / 2
1

在Python 3中:

>>> 3 / 2
1.5
>>> 3 // 2
1

因此,您的getprimes()函数应包含以下代码:

while num > 1:
    factor = getNext(num, factor)
    primes.append(factor)
    num //= factor