티스토리 뷰
아래 코드를 보자.
>>> 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 |
댓글