为什么从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 版本比这更旧。

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


以上是为什么从numpy按位左移在不同系统上给出不同的结果?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>