티스토리 뷰

python

넘파이와 파이썬의 정수 표현 범위

게으른 the lazy 2025. 1. 21. 20:53

https://www.thoughtco.com/bigger-than-a-trillion-1857463

 

아래 코드를 보자.

 

>>> import numpy as np
>>> np.cumprod(np.arange(1, 30))
array([                   1,                    2,                    6,
                         24,                  120,                  720,
                       5040,                40320,               362880,
                    3628800,             39916800,            479001600,
                 6227020800,          87178291200,        1307674368000,
             20922789888000,      355687428096000,     6402373705728000,
         121645100408832000,  2432902008176640000, -4249290049419214848,
       -1250660718674968576,  8128291617894825984, -7835185981329244160,
        7034535277573963776, -1569523520172457984, -5483646897237262336,
       -5968160532966932480, -7055958792655077376])
>>>

 

21!부터 제대로 계산이 되지 않았다. 오버플로우가 발생했음을 예상할 수 있다. 20!에다가 21을 곱해보자.

 

>>> arr = np.cumprod(np.arange(1, 21))
>>> arr[-1]*21
<stdin>:1: RuntimeWarning: overflow encountered in scalar multiply
np.int64(-4249290049419214848)
>>>

 

아하! 역시 오버플로우가 발생했다. 자료형은?

 

>>> arr.dtype
dtype('int64')
>>>

 

int64이다. 20!까지는 2^63-1을 넘기지 않다가 21!이 이 값을 넘겼으리라. 이제 같은 계산을 파이썬으로 해보자.

 

>>> 2432902008176640000 * 21
51090942171709440000
>>>

 

오잉? 잘 된다. 왜 때문일까? 놀랍게도, 파이썬에서는 정수가 커지면 그 정수가 들어앉은 메모리를 늘려준다. 그래서 이론상 파이썬 정수는 최대값이 없다. 자세한 내용은 여기를 클릭!

 

- 게으른 파이썬

'python' 카테고리의 다른 글

파이썬 중고급 스킬들  (0) 2025.01.10
conda 초간단 매뉴얼  (0) 2024.08.20
list.extend와 list.iadd의 차이  (0) 2024.07.07
syntax sugar in python  (0) 2024.06.03
왜 numpy에서 5 < ndarray < 15가 허용되지 않는가?  (0) 2024.05.31
댓글