License
License: Creative Commons BY-NC-SA
5회차
1. Contents
Floating number
부동소수점에 관한 소개가 나왔다.
import math
from re import A
a = math.sqrt(2)
b = a*a
print(a)
print(b)
print(b==2)
print(b==a)
위와 같은 코드를 실행하면
1.4142135623730951
2.0000000000000004
False
False
위와 같은 답이 나온다. 저장된 값이 제곱근의 근사치이기 때문이다.
부동소수점에 대해서는 이전에 정리를 해두어서 다시 적지는 않는다.
위와 같은 상황은 두가지 근본적 문제를 내포한다.
- 우리가 결과로 본 것이 정확한 답이 아닐 수 있다
- 정수에 관련된 것과 다르게 셀 수 없는 수라면 계산할 수 없다.
Succesive refinement
Guess, Check, Improve
이전의 추측이 맞다고 가정하여, 더 높은 가능성을 가진 계산 방법을 찾는다.
적당한 추측(Guess)를 설정하고, 조건문과 반복문을 이용하여 값을 반환받는다. 재귀적으로 문제를 해결하는 방식 중 하나이다.
2. Q&A
수업시간에 사용한 Bisetion method(이분탐색)이 잘 이해가 가지 않았기에 혼자서 검토 해보았다.
def squareRootBi(x, epsilon):
assert x>= 0, 'x must be non-negative, not' + str(x)
assert epsilon > 0, 'epsilon must be postive, not' + str(epsilon)
low = 0
high = x
guess = (low + high) / 2.0
ctr = 1
while abs(guess**2 -x) > epsilon and ctr <= 100:
if guess**2 < x:
low = guess
else:
high = guess
guess = (low + high) / 2.0
ctr += 1
assert ctr <= 100, 'Iteration count exceeded'
print ('Bi method. Num. iterations: ', ctr, 'Estimate: ', guess)
return guess
squareRootBi(16, 0.0001)
위의 코드를 실행하면
Bi method. Num. iterations: 2 Estimate: 4.0
위와 같은 답이 나온다
--- ctr 1회차 ---
low | high | guess | x | ctr |
---|---|---|---|---|
0 | 16 | 8 | 16 | 1 |
high = x로 설정되어 16의 값을 가진다.
guess는 절반의 값이니 8을 가진다.
조건문에서 8^2 (=64) > 16이기 때문에 high = guess (=8)이 된다.
--- ctr 2회차 ---
low | high | guess | x | ctr |
---|---|---|---|---|
0 | 8 | 4 | 16 | 2 |
다음 분기에 시행되는 반복문에서는 high가 8이 되며 guess는 그 절반인 4가 된다. 이때 guess^2 (=16) - 16 > epsilon (=0.0001)을 만족하며 종료한다.
----
위의 Floating number에 있는 것을 Windows Calculator로 직접 계산해본 결과,
루트2의 값이 어느정도 근사치에 가까워지면 근사치가 아닌 2가 출력된다. 위에 있는 것과 동일한 원리를 이용한게 아닐까 추측된다.
'Computer science > Etc' 카테고리의 다른 글
MIT 6.00 7회차 강의후기 (0) | 2022.04.11 |
---|---|
MIT 6.00 6회차 강의후기 (0) | 2022.04.11 |
MIT 6.00 4회차 강의후기 (0) | 2022.04.11 |
MIT 6.00 3회차 강의후기 (0) | 2022.04.11 |
MIT 6.00 2회차 강의후기 (0) | 2022.04.11 |