개발 이야기/TIL

23.01.04 python format, map, bit shift 연산

혁진 2023. 1. 4. 22:17

#1 python format과 부동소수점 

실수를 다룰 때 소수점 아래자리를 다루는 방법은 여러가지가 있다. 

 -1 round이용

 문자 그대로 반올림을 하는 함수, 공식문서를 확인하면 다음과 같다(https://docs.python.org/ko/3/library/functions.html)

number 를 소수점 다음에 ndigits 정밀도로 반올림한 값을 돌려줍니다. ndigits 가 생략되거나 None 이면, 입력에 가장 가까운 정수를 돌려줍니다.

일반적인 파이썬 객체 number 의 경우, round 는 number.__round__ 에 위임합니다.

참고: float에 대한 round() 의 동작은 예상과 다를 수 있습니다: 예를 들어, round(2.675, 2)  2.68 대신에 2.67 을 제공합니다. 이것은 버그가 아닙니다: 대부분의 십진 소수가 float로 정확히 표현될 수 없다는 사실로부터 오는 결과입니다. 자세한 정보는 부동 소수점 산술: 문제점 및 한계 를 보세요.

여기서 포인트는 컴퓨터는 실수, 특히 소수를 정확히 표현할 수 없다는 것이다. 이에 따라서 round가 우리 예상과 다르게 반올림을 하지 않는 경우가 있다. 즉, round(0.5) => 0으로 표현될 수도 있다는 것이다!(실제로도 그렇다)

따라서 우리는 부동소수점 오류를 주의해야함을 여기서도 확인 가능하다.

(참조: https://stackoverflow.com/questions/455612/limiting-floats-to-two-decimal-points)

-2 format

format도 동일한 문제를 조금 더 깔끔하게 정리해준다.  format(c, ".3f")라는 식으로 표현하고 이는 소수 3째자리까지 표기하라 라는 의미이다. round(c,3)로 하는 경우 부동소수점 때문에 우리가 원하는 결과가 나오지 않을 수도 있다.

 

#2 map

매우 편리한 함수이다. 형태는 map(function, iterable)이다. 

나는 이번에 간단히 자료형을 바꾸어 줄때 사용하였다. (예시: a,b = map(int, input().split()))

 

#3 bit shift 연산 << >>

알다시피 컴퓨터에서는 bit로 값을 저장한다. 즉, 2진수를 사용한다. 그럼으로 우리가 bit를 왼쪽으로 한칸 옮기면 2를 곱하는 것이고 오른쪽으로 한칸 옮기면 나누는 것이다. 

a<<b는 a를 b칸 왼쪽으로 옮긴다는 뜻이다. 이는 즉, a*(2**b)를 계산하겠다는 의미와 같다. 

bit shift연산은 나중에 꽤나 많이 사용되기 때문에 미리 익숙해져있는 것이 좋을 것 같다(저번학기 자료구조 시간에 hash에서도 언급된 적있음)