簡體   English   中英

為什么從 numpy 按位左移在不同系統上會給出不同的結果?

[英]Why does bitwise left shift from numpy give different results on different systems?

我在兩個不同的系統上使用 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 版本比這更舊。

如果您想要定義的行為,請不要嘗試進行這樣的轉變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM