백준 4434번을 풀다가 파이썬은 반올림으로 오사오입을 사용한다는 것을 알게 되었다.
오사오입이란, 쉽게 말해 상위 단위를 짝수로 만드는 것이다. 5를 초과할 경우 올림하고, 5 미만일 경우 버림한다.
ex) 0.5->0 ,1.5->1
왜 이런 계산법이 있지 생각했지만, 사사오입에는 중간값인 0.5를 올려버리는 편향이 발생하는데 이 편향을 제거한것이 오사오입이다. (공학의 유효숫자 개념에서 많이 사용하는 방식이라 Python3에 채택된거 같다.)
A = 0.5
print("{} : {:.10f}".format(A,A))
A = 1.5
print("{} : {:.10f}".format(A,A))
A = 2.5
print("{} : {:.10f}".format(A,A))
A = 3.5
print("{} : {:.10f}".format(A,A))
A = 4.5
print("{} : {:.10f}".format(A,A))
A = 5.5
print("{} : {:.10f}".format(A,A))
A = 6.5
print("{} : {:.10f}".format(A,A))
A = 7.5
print("{} : {:.10f}".format(A,A))
A = 8.5
print("{} : {:.10f}".format(A,A))
A = 8.5
print("{} : {:.10f}".format(A,A))
A = 9.5
print("{} : {:.10f}".format(A,A))
결과)
이를 파이썬에서 해결하기 위해(사사오입으로 만들기 위해서는)
1) 올림자리(0.001) * 5를 더해주고 버림 연산을 하거나
2) (올림자리 근처의 0.0000001과 같은) 미세한값을 더해주어야 한다.
여기서 미세한값을 더해주는 이유는 부동소수점 오차가 있기 때문인데,
이를 코드로 설명하자면
A = 0.05
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.15
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.25
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.35
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.45
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.55
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.65
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.75
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.85
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
A = 0.95
print("{} : {:.100f}%".format(A,A))
print("{} : {}%".format(A,round(A,3)))
결과)
결과에서 보았을 때 부동소수점으로 저장된 값이 결손치 때문에 딱떨어지지 않아 (사람기준에서) 제대로 오사오입이 되지않는 문제 가 있기 때문에 이 결손치를 상회하고 올림에 방해가 되지 않는 미세한 값을 더해줘야한다.
+오사오입을 따르는 것은 "비교" 아래의 값들로 확인할 수 있다.
'코딩 공부 > TIL' 카테고리의 다른 글
[알고리즘]정렬 (0) | 2023.07.15 |
---|---|
코딩 습관 들이기 (0) | 2023.06.27 |
깃 과 깃 허브 기초 명령어 (0) | 2023.03.15 |
[TIL] 유니티 기초 1 (0) | 2023.03.08 |
[TIL] 레퍼런스, 동적할당 그리고 운영체제 (0) | 2023.03.08 |