gpt4 book ai didi

python - Python 在处理大量数字/列表时是否有问题,或者我的代码有问题?

转载 作者:行者123 更新时间:2023-12-01 23:17:31 25 4
gpt4 key购买 nike

我有以下代码:

def main(n):
sequence = []
while n not in sequence:
sequence.append(n)

if n % 2 == 0:
i = n / 2
else:
i = (n * 3) + 1
n = int(i)

print("Sequence length: " + str(len(sequence)-1))

n = int(input("Number: "))
main(n)

它从用户那里获取一个整数,然后计算该数字的“3x+1”(或“Collat​​z”)序列(详见 http://www.ericr.nl/wondrous/index.html#part1)。然后显示序列的长度。

为了确保我的代码按预期工作,我将我的结果与 http://www.ericr.nl/wondrous/delrecs.html 上的表格进行比较“延迟”列似乎是序列长度,“N”是输入的初始整数。我的代码给出了所有“N”值(我已经随机测试)的正确长度,最大为 1,899148,184679 (#92)。但是,对于下一个“N”值(2,081751,768559,#93),它给出的长度为“385”(而不是“1437”)...对于“N”上的所有值也是如此(即我测试过)比表上的要大 - 我的代码给出的答案比他们所做的要小得多。

Python 是否存在可能导致此行为的大数字问题,或者我的代码有问题?

我承认我不完全理解“延误记录”,或者该网页上的大部分信息。但是即使我错误地假设“延迟记录”只是此方法生成的序列的长度,我的代码会计算相同的值直到那个特定数字似乎很奇怪......

我正在使用 Python 3.8.10 以防万一。

最佳答案

在此过程中的某个地方,您遇到了一个浮点错误。 “但我用的是整数!”我听到你说,Python 正在这条线上进行浮点除法:

i = n / 2

看似无伤大雅,但改为整数除法解决了问题:

i = n // 2

在数百个值之后,其中一个除法给您一个错误,该值比实际整数值小一些 epsilon,然后在您调用 int(n) 时向下舍入。

编辑:在仔细检查我的最后一点以找到失败的值后,我不太正确。实际发生的情况是,由于 Python 的 BigInt 实现,整数除法总是准确的,而 float 除法则不然,因为它仍然使用常规 float 来提高速度。如果您的数字足够大,那么根本就没有足够的字节来准确存储数字,这将导致舍入错误。

有问题的号码是 19981441939834942。使用整数除法得到 9990720969917471,而浮点除法得到 9990720969917472.0

这在您使用的任何语言中都是一个问题(除了大多数其他语言不允许您不小心对整数使用浮点除法),所以请确保使用整数除法!

关于python - Python 在处理大量数字/列表时是否有问题,或者我的代码有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68645065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com