我有这么小(可能效率低但但仍然合理)的代码:
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])
我认为这是一个数据类型准确性问题,但我们将不胜感激。有没有办法做得更好?
答案 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
后缀。