3.1. 숫자#

파이썬에서는 숫자를 다음과 같은 두 가지 형식으로 정의할 수 있다.

  • int : 정수형

  • float : 부동소숫점

int 형식은 숫자를 정수(integer)로 나타낼 때 사용하는 형식이다. float은 소수점이 붙은 형태인 실수를 저장할 때 사용하는 형식이다.

데이터를 저장하는 형식(type) 이 다르다는 것은 숫자를 컴퓨터에 입력할 때 메모리(memory)에 저장하는 방법이 다르다는 것을 의미한다. 메모리에 저장하는 방식이 다르면 숫자를 사용할 때 여러 가지 차이점이 나타난다.

파이썬에서 함수 type() 을 이용하면 자료의 형식을 알려준다

import math
import sys

다음과 같이 88.0은 수학적으로는 같은 숫자이지만 8은 정수형(int)으로 저장되고 8.0 은 부동소수점 형식(float)으로 저장된다.

8
8
8.0
8.0
type(8)
int
type(0.8)
float

정수형 숫자들의 계산에서 실수가 나오면 부동소수점 형식으로 저장된다.

x = 1
y = 3 
x/y
0.3333333333333333
type(x/y)
float

파이썬에서 사용하는 정수형은 숫자의 크기에 제한을 받지 않는다 (파이썬 버젼 3.0 부터 적용되며 버젼 2.X 에서는 제약이 있다)

1234567 ** 100
1417315082138567032720255210353519969302563981215290038076973514044236598756327059769035336648132374674324215193204422244594445716341487457694617732238625874314626583491669701284686587855773536717426096092211598174166575328099956875492262010326699346133893700375355315111937233492319262187261209590353793785874777434103656417302563919988176126139015434933601141866086270683340764422105480418576759769165966112295211246642864160246076336957750304736038529329501453440773670860919386637258331504837566880577668021013841189499717194709469762851658008500781229342231867145722511317611139783942910257543607972348001

부동소수점 형식은 크기에 제한이 있다. 너무 작은 수는 부동소수점 형식으로 정확하게 저장할 수 없다. 또한 너무 큰 수도 부동소수점 형식으로 저장할 수 없다.

보통 여러분이 사용하는 컴퓨터에서는 다음과 같이 소수점 17 자리 이상의 아주 작은 실수는 정확하게 숫자의 값을 저장하지 못한다.

1/3 + 0.0000000000000001  # 소수점 16자리 부동소수점
0.3333333333333334
1/3 == (1/3 + 0.0000000000000001)
False
1/3 + 0.00000000000000001  # 소수점 17자리 부동소수점
0.3333333333333333
1/3 == (1/3 + 0.00000000000000001)
True

두 개의 실수의 차이를 계산하는 경우 두 수의 차이 값이 우리가 생각하는 대수적인 결과와 다를 수 있습니다.

0.55 - 0.54
0.010000000000000009
(0.55 - 0.54) == 0.01
False
0.5555555555555555 - 0.5555555555555554
1.1102230246251565e-16

다음 두 표현식은 대수적으로 같은 뜻이지만 컴퓨터 표현식의 결과에 미세한 차이가 있다.

\[ \left ( \sqrt{3} \right )^2 \quad \sqrt{3^2} \]
(3**0.5)**2 
2.9999999999999996
(3**2)**0.5
3.0
(3**0.5)**2 - (3**2)**0.5
-4.440892098500626e-16

파이썬이 대수적으로 구별할 수 있는 가장 작은 수는 2.220446049250313e-16 이다. 이러한 수를 계산 엡실론(Machine epsilon)이러고 부르며 부동소수점 연산에서 반올림을 함으로써 발생하는 오차의 상한이다. 파이썬의 계산 엡실론은 sys.float_info.epsilon 으로 알 수 있다.

계산 엡실론보다 작은 수는 컴퓨터를 이용한 계산에서 차이를 구별할 수 없다.

machine_epsilon = sys.float_info.epsilon
machine_epsilon
2.220446049250313e-16
1.0 + machine_epsilon == 1.0
False
1.0 + machine_epsilon/2 == 1.0
True

정리하면 실수를 저장하는 float 형식은 모든 실수를 정확하게 저장할 수 없고 아주 작은 수는 소수점 16 정도에서 잘려서 근사값으로 저장된다.

예를 들어 원주율을 나타내는 \(\pi\)math 라이브러리에 pi 라는 이름으로 사용할 수 있으며 다음과 같이 소수점 16 자리까지 저장한다.

math.pi
3.141592653589793

또한 부동소수점 형식은 너무 큰 수도 저장할 수 없다. 여러분이 사용하는 컴퓨터에서 부동소수점 형식으로 저장할 수 있는 최대값은 \(1.7976931348623157 \times 10^{308}\) 이다.

파이썬에서 큰 수를 출력해주는 경우 과학적 표기법(scientific notation)을 사용한다. 아래 식에서 2.0e+306\(2.0 \times 10^{306}\) 을 의미한다. 큰 수 \(2.0 \times 10^{308}\) 은 파이썬의 부동소수점 형식으로 저장할 수 없기 때문에 결과를 inf 로 나타낸다.

2.0e+306
2e+306
2.0e306 * 100
inf
-2.0e306 * 100
-inf

지금까지 숫자를 저장할 수 있는 두 가지 자료 형식을 알아보았다. 또한 부동소수점으로 저장할 수 있는 실수의 범위는 제약이 있음에 유의하자.

이러한 제약으로 문제가 발생하는 경우는 자주 일어나지만, 이 과목의 범위 안에서는 부동소수점의 제약으로 인한 문제는 발생하지 않을 것이니 잠시 이 사실은 잊고 있어도 된다.