2013-05-25 9 views
13

32- और 64-बिट में पूर्णांक गणित करने का सबसे अच्छा तरीका क्या है, ताकि सी में ऐसा अतिप्रवाह होता है?पायथन 32-बिट और 64-बिट पूर्णांक गणित जानबूझकर ओवरफ्लो

उदा। (65536 * 65536 + 1) * (65536 * 65536 + 1) 64-बिट गणित में 0x0000000200000001 होना चाहिए, और इसका सटीक मूल्य (गैर-बहने वाला) 0x10000000200000001 नहीं होना चाहिए।

+3

साइन ओवर ओवरफ्लो सी में अपरिभाषित व्यवहार का कारण बनता है, इसलिए सख्ती से सवाल बोलना व्यर्थ है। – Cairnarvon

+0

^अभी तक एक अन्य कारण सी कुछ प्रकार की संख्यात्मक गणना के लिए सहायक नहीं है। :-( –

+0

समान, लेकिन डुप्लिकेट नहीं। 32-बिट प्रश्न (या 16-बिट, जिसे मैंने नहीं पूछा) int -> लंबे int व्यवहार से अलग है। –

उत्तर

19

उचित 0-उचित 32- या 64-बिट मास्क (0xffffffff या 0xffffffffffffffff) के साथ परिणाम।

12

उचित पूर्णांक आकार और अतिप्रवाह के साथ उपयोग NumPy है अधिक सी की तरह:

32 बिट:

>>> np.uint32(2**32-3) + np.uint32(5) 
__main__:1: RuntimeWarning: overflow encountered in uint_scalars 
2 

64 बिट:

:

>>> i64=np.uint64(65536*65536+1) 
>>> hex(i64*i64) 
'0x200000001L' 

अजगर की मूल पूर्णांक के साथ तुलना करें

>>> hex((65536*65536+1)*(65536*65536+1)) 
'0x10000000200000001L' 

आप देख सकते हैं कि NumPy आपकी इच्छा के अनुसार कर रहा है।

संबंधित मुद्दे