为什么从 numpy 按位左移在不同系统上给出不同的结果?

问题描述

我在两个不同的系统上使用来自 numpy 的按位运算并得到不同/不一致的结果。经过一番调查,我发现 left_shift 导致了问题。如果我执行以下操作:

xs = [i for i in range(100)]
np.left_shift(xs,xs)

在我得到的第一个系统上:

array([                   0,2,8,24,64,160,384,896,2048,4608,10240,22528,49152,106496,229376,491520,1048576,2228224,4718592,9961472,20971520,44040192,92274688,192937984,402653184,838860800,1744830464,3623878656,7516192768,15569256448,32212254720,66571993088,137438953472,283467841536,584115552256,1202590842880,2473901162496,5085241278464,10445360463872,21440476741632,43980465111040,90159953477632,184717953466368,378231999954944,774056185954304,1583296743997440,3236962232172544,6614661952700416,13510798882111488,27584547717644288,56294995342131200,114841790497947648,234187180623265792,477381560501272576,972777519512027136,1981583836043018240,4035225266123964416,8214565720323784704,-1729382256910270464,-2882303761517117440,-4611686018427387904,-6917529027641081856,-9223372036854775808,130,264,536,1088,2208,4480,9088,18432,37376,75776,153600,311296,630784,1277952,2588672,5242880,10616832,21495808,43515904,88080384,178257920,360710144,729808896,1476395008,2986344448,6039797760,12213813248,24696061952,49928994816,100931731456,204010946560,412316860416,833223655424,1683627180032,3401614098432])

在第二个系统上我得到:

array([                   0,0])

因此,正如您所看到的,在某些点上,结果会变得不一致。有谁知道是什么原因造成的?

添加

“不同的系统”是指不同的计算机。第一台电脑是 numpy 1.15.1,第二台电脑是 1.15.2。

解决方法

旧版本的 NumPy 没有定义如果您尝试按 >= 类型的宽度进行移位的量,移位运算符会做什么。它们基本上只是将语义委托给 C 移位运算符 for which this is undefined behavior。根据硬件和编译器的详细信息,几乎任何事情都可能发生(理论上最多并包括崩溃、安全问题和任意其他不当行为)。

这在 1.18 中得到了 changed,但您的 NumPy 版本比那个旧。

如果你想要明确的行为,不要试图做那样的转变。