知之者 不如好之者, 好之者 不如樂之者

기계처럼 살지 말고, 즐기는 인간이 되자

Code/Python

[수치해석] Python을 이용한 Machine epsilon(한계 오차) 계산

코방코 2023. 1. 6. 13:36
728x90

컴퓨터는 숫자를 저장할 때 2진법으로 저장한다.

따라서, 입력 받은 숫자를 2진법으로 저장하고, 

저장된 숫자를 다시 10진법으로 변환하여 출력하는 과정을 거친다.

 

당연하게도 숫자 하나를 저장하기 위한 컴퓨터의 메모리 크기는 제한적이다.

그렇기 때문에 컴퓨터의 숫자 표시 정확도에 한계가 존재한다.

예를 들어, 완전한 1을 저장하고 싶다 해도

1.00000000000000..00000 이 아닌

1.0000000000000011102... 이런 식으로 저장된다는 의미다.

무수한 0 뒤에 표시되는 숫자는 표시 한계점 이상의 2진법과 10진법 변환 과정에서 유도되는 숫자이다.

이 한계는 숫자를 담는 메모리의 크기에 따라 결정된다.

 

당연하게도 표시 한계 이하로부터는 컴퓨터는 더 이상 동일함을 판단할 수가 없고,

이 때문에 한계점 이내까지만 동일하다면 동일한 숫자로 여긴다.

 

이 포스트는 해당 한계를 확인하기 위한 코드다.

숫자가 어느정도 이하의 숫자부터 무시를 하고 동등하게 고려하는지 확인하고자 한다.

 

· Code (Python)

#Set "a" as 1
a=1
i=0

# Use while loop until a+1=1
# if 1+a>1 , divide "a" by 2
while 1+a>1:
    a=a/2
    i+=1

#print "a" when 1+a=1    
print("a =", a)
print("iteration =", i)

 

· Explanation

우선, a를 1로 저장한다.

그리고 해당 a를 while문을 통해 계속 2로 나누면서,

while문의 조건 1+a>1을 탈출하는지 확인한다.

이 때 2로 나누는 이유는 2진법 표기의 가수부 길이를 확인하기 위해서이다.

그리고 1+a=1 이라고 여기는 a가 되었을 때 while문을 탈출한 a를 출력한다.

 

· Result

위 코드의 실행 결과값은 다음과 같다.

 

 

필자의 컴퓨터는 64비트이고 64비트 컴퓨터의 레지스터는 64개로,

간단하게 말해서 하나의 수를 저장하는데 64비트 메모리를 가진다고 할 수 있다.

컴퓨터에서 정확하게 수를 표현하기 위해 주로 사용하는 부동소수점(Floating point) 방식은 

해당 64비트의 메모리에 들어온 숫자를 1비트의 부호 비트와 11비트의 지수부, 52비트의 가수부로 표현한다.

출처 : https://en.wikipedia.org/wiki/Double-precision_floating-point_format

 

결과를 보면 a를 1부터 계속 2로 나눈 결과 iteration 이 53이 출력되었다. 

이는 52개의 가수부를 전부 이용하여 10진수를 표기하고도 그 이상은 비교할 수 없어

1.0000000000000011102... 이 1과 동일하다고 판단하여 while 조건문을 빠져나와버리는 

위 코드의 결과와 일치한다.

 

따라서 64비트 컴퓨터의 machine epsilon, 수치 한계 오차는 1.1102230246251565e-16 이 되는 것이다.

 

728x90
반응형