为什么从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,
-9223372036854775808, 64, 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, 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,
-9223372036854775808, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0])
因此,如您所见,在某些点上,结果变得不一致。有谁知道是什么原因造成的?
添加
“不同的系统”是指不同的计算机。第一台计算机有 numpy 1.15.1,第二台计算机是 1.15.2。
回答
旧版本的 NumPy 没有定义如果您尝试按 >= 类型宽度进行移位的量,移位运算符会做什么。它们基本上只是将语义委托给 C 移位运算符,对于它来说,这是未定义的行为。根据硬件和编译器的详细信息,几乎任何事情都可能发生(理论上包括崩溃、安全问题和任意其他不当行为)。
这在 1.18 中发生了变化,但您的 NumPy 版本比这更旧。
如果你想要明确的行为,不要试图做这样的转变。