在numpy中计算Fibonacci的奇怪值

时间:2016-06-26 20:27:52

标签: python numpy

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

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])

我认为这是一个数据类型准确性问题,但我们将不胜感激。有没有办法做得更好?

1 个答案:

答案 0 :(得分:4)

  

我认为这是一个数据类型准确性问题,但我们将不胜感激。

默认情况下,numpy数组似乎使用带符号的32位整数,它们只能存储-2,147,483,648和2,147,483,647之间的值。一旦超过最大值,数字就会开始“回绕”到负值。有关更好的说明,请参阅integer overflow上的WP文章。

  

有没有办法做得更好?

您可以切换到使用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])

numpy如果你想要>>> 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) 使用Python long,那就also possible了。

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

...允许无界的整数值...

L

请注意,如果您使用的是Python v2.x而不是v3.x,则只应在数字上看到openssl req -x509 -newkey rsa:2048 -keyout selfsigned.key -nodes -out selfsigned.cert -sha256 -days 1000 openssl x509 -outform der -in selfsigned.cert -out self.der 后缀。