gpt4 book ai didi

python - 在 numpy 中计算斐波那契的奇怪值

转载 作者:行者123 更新时间:2023-11-28 22:35:41 28 4
gpt4 key购买 nike

我有这么小的(可能效率低下,但仍然合理)代码:

fib = np.array([0,1])
for i in range(2,100):
fib = np.append(fib, fib[-2] + fib[-1])

首先回顾一下结果,一切看起来都不错:

In [17]: fib[:20]
Out[17]: array([ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,
89, 144, 233, 377, 610, 987, 1597, 2584, 4181])

但随后就变得奇怪了:

In [18]: fib[51:60]
Out[18]:
array([-1109825406, -1408458269, 1776683621, 368225352, 2144908973,
-1781832971, 363076002, -1418756969, -1055680967])

我认为这是一个数据类型准确性问题,但如果您能提供清晰的解释,我们将不胜感激。有没有办法做得更好?

最佳答案

I figure this is a data type accuracy issue, but a clear explanation will be appreciated.

numpy 数组似乎默认使用带符号的 32 位整数,它们只能存储 -2,147,483,648 和 2,147,483,647 之间的值。一旦超过最大值,数字就会开始“环绕”为负值。请参阅关于 integer overflow 的 WP 文章以获得更好的描述。

Is there a way to do better?

您可以切换到使用 64 位整数,这对于您给出的示例来说很好...

>>> fib = np.array([0, 1], dtype=np.int64)
>>> for i in range(2,100): fib = np.append(fib, fib[-2] + fib[-1])
...
>>> fib[51:60]
array([ 20365011074, 32951280099, 53316291173, 86267571272,
139583862445, 225851433717, 365435296162, 591286729879, 956722026041])

...但在数组末尾失败...

>>> fib[91:100]
array([ 4660046610375530309, 7540113804746346429, -6246583658587674878,
1293530146158671551, -4953053512429003327, -3659523366270331776,
-8612576878699335103, 6174643828739884737, -2437933049959450366])

also possiblenumpy 中使用 Python longs 如果你想...

>>> fib = np.array([0, 1], dtype=object)
>>> for i in range(2,100): fib = np.append(fib, fib[-2] + fib[-1])
...
>>> fib[51:60]
array([20365011074L, 32951280099L, 53316291173L, 86267571272L,
139583862445L, 225851433717L, 365435296162L, 591286729879L,
956722026041L], dtype=object)

...允许无限整数值...

>>> fib[91:100]
array([4660046610375530309L, 7540113804746346429L, 12200160415121876738L,
19740274219868223167L, 31940434634990099905L, 51680708854858323072L,
83621143489848422977L, 135301852344706746049L,
218922995834555169026L], dtype=object)

请注意,如果您使用的是 Python v2.x 而不是 v3.x,您应该只会在数字上看到 L 后缀。

关于python - 在 numpy 中计算斐波那契的奇怪值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38042877/

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