컴퓨터를 이용한 숫자 데이터 처리는 빠르고 정확한 결과를 보여 주지만, 주의를 기울이지 않으면 예상치 못한 결과를 가져올 수 있습니다. 숫자 데이터의 특징과 정확한 활용법에 대해 알아보겠습니다.
✅컴퓨터가 처리하는 숫자 데이터의 특징
박찬호 선수는 국내 최초로 미국 메이저리그에 진출한 뒤, 선수 생활을 은퇴할 때까지 많은 기록을 쌓았고, 아시아 선수 중 최다 승수를 보유한 투수입니다. 메이저리그는 공식 홈페이지(mlb.com)에 모든 선수의 개인 기록을 제공하고 있는데, 박찬호 선수의 메이저리그 기록을 가져와 살펴보면서 숫자 데이터의 특징에 대해 알아보겠습니다.(박찬호 선수는 메이저리그 선수생활을 은퇴했기 때문에 이 데이터는 언제 가져와도 동일합니다.)
박찬호 선수(#61)의 메이저리그 기록
게임 수(G) | 승(W) | 패(L) | 평균 자책점(ERA) | 투구 이닝 수(IP) |
476 | 124 | 98 | 4.36 | 1993.0 |
데이터를 보면 숫자에 소수점(.)이 붙은 게 있고 붙지 않은 게 있죠? 예를 들어 게임 수, 승패에는 소수점이 없고, 나머지 데이터에는 소수점이 있습니다. 왜 그런지 항목별로 살펴보겠습니다.
소수점이 없는 데이터
- 게임 수: 이 데이터는 선수가 한 번 출전하면 ‘1씩 증가’하는 데이터입니다. 따라서 이 데이터는 ‘0.1번 출전’이나 ‘0.9번 출전’ 등과 같이 소수점이 포함될 수 없습니다. 박찬호 선수는 총 476번 게임에 출전한 것을 알 수 있습니다.⠀
⠀⠀⠀ - 승패: 야구는 게임의 승패에 결정적인 기여한 투수 한 명에게 승리 또는 패배의 기록을 부여합니다. 여기서 중요한 것은 승리 또는 패배에 따라 관련 기록이 ‘1씩 증가’한다는 것이죠. ‘0.1번 승리’ 또는 ‘0.9번 패배’ 같은 데이터는 있을 수 없습니다. 따라서 이 데이터도 소수점이 포함될 수 없습니다. 박찬호 선수는 총 124승을 거둔 것을 알 수 있습니다.
소수점이 있는 데이터
- 투구 이닝 수: 야구는 공격과 수비로 나누어 게임이 진행되는데, 투수(공을 던지는 사람)는 수비할 때 등장합니다. 야구 1게임당 총 9번의 수비를 할 수 있고, 이때 수비를 진행한 횟수를 이닝이라고 합니다. 예를 들어 투수가 9번의 수비를 모두 담당했다면 ‘9이닝을 소화했다’라고 표현하죠. 많은 이닝을 소화할수록 좋은 투수로 평가받습니다.
⠀
만약 투수가 공을 던지던 중 다른 투수로 교체되면 어떻게 될까요? 이때는 교체 전까지 처리한 타자(공을 치는 사람) 수를 반영한 횟수를 기록합니다. 예를 들어, 한 명의 타자를 처리했다면 ‘0.1’, 두 명의 타자를 처리했다면 ‘0.2’로 표현하는 식이죠. 따라서 투구 이닝 수 데이터는 소수점이 필요합니다.
⠀⠀⠀
- 평균 자책점: 자책점이란 수비할 때 투수의 잘못으로 실점한 경우 그 점수를 말합니다. 예를 들어 3 자책점이란 투수의 잘못으로 3점 실점한 것을 의미하죠. 평균 자책점이란 1게임(9이닝)당 자책점을 의미합니다. 구체적인 산출 공식은 지금 다루지 않지만, 중요한 것은 평균 자책점을 구하기 위해 현재까지 투수의 투구 이닝 수로 나눈다는 것입니다.
⠀
숫자의 나눗셈 연산은 소수점이 발생할 가능성이 높고, 야구에서는 그 소수점을 매우 중요하게 여깁니다. 따라서 평균 자책점 데이터는 소수점이 필요합니다. 참고로 평균 자책점이 낮을수록 좋은 투수로 평가받습니다.
지금까지 주어진 다양한 항목(게임 수, 평균 자책점 등)의 숫자 데이터에 소수점이 있어야 하는 이유를 하나씩 살펴봤습니다. 그런데 왜 이렇게까지 숫자 데이터의 소수점 포함 여부를 자세히 살펴봤을까요? 그 이유는 바로 숫자 데이터의 소수점 포함 여부에 따라 컴퓨터가 숫자 데이터를 처리하는 방식이 매우 다르기 때문입니다. 특히 소수점이 있는 숫자 데이터의 계산 결과를 예상할 때는 항상 조심해야 합니다.
이제 본격적으로 코딩 이야기를 해보겠습니다. 일반적으로 코딩할 때 다루게 될 숫자 데이터는 소수점이 없는 것과 있는 것, 이렇게 두 가지 밖에 없습니다. 소수점이 없는 숫자 데이터를 정수integer라고 하고, 소수점이 있는 숫자 데이터를 부동 소수점 수floating point number 혹은 부동 소수점floating point이라고 합니다. 부동 소수점 수는 편의상 실수real number라고 표현하기도 합니다.
박찬호 선수의 데이터를 코딩에 대입해보면 게임 수와 승패는 정수로, 평균 자책점와 투구 이닝 수는 부동 소수점 수로 표현할 수 있어요.
- 정수: 게임 수, 승패
- 부동 소수점 수: 투구 이닝 수, 평균 자책점
✅부동 소수점 수 처리의 함정
이제 본격적으로 정수와 부동 소수점 수의 차이점에 대해서 알아보겠습니다. 실제 코딩을 통해서 결과를 비교하면 그 차이점을 명확히 알 수 있어요. 정수와 부동 소수점 수로 간단한 덧셈 연산을 해보겠습니다.
☑️정수의 덧셈
먼저 정수 계산부터 해 볼까요? 아래는 1과 2를 덧셈한 결과를 표시하는 프로그램입니다. 이와 같이 코드를 작성해 실행하면 결과를 확인할 수 있습니다.
print(1 + 2)
print(3)
[실행 결과]
3 |
예상한 대로 1과 2를 덧셈한 결과가 3이 나왔습니다. 어떤 정수로 테스트하더라도 우리가 알고 있는 덧셈의 결과가 나옵니다.
☑️부동 소수점 수의 덧셈
이번에는 부동 소수점 수의 덧셈을 코딩해 보겠습니다.
print(0.1 + 0.2)
print(0.3)
[실행 결과]
0.30000000000000004 |
분명 0.1과 0.2를 더하면 0.3이 나와야 되는데, 다른 결과가 나왔습니다. 몇 번을 다시 실행해도, 파이썬이 아닌 다른 프로그래밍 언어로 코딩해도 같은 결과가 나옵니다. 위 결과를 어떻게 해석해야 할까요? 2줄에서 print 명령어에 0.3을 전달한 결과 0.3이 정확히 출력된 것으로 보아, 컴퓨터가 부동 소수점 수 0.3을 제대로 인식하긴 하는 것 같은데 말이죠.
다른 예제를 실행해 보겠습니다. 첫 번째 수는 0.1로 두고, 두 번째 수를 0.1부터 0.9까지 총 9번 덧셈하는 계산을 해 볼게요.
print(0.1 + 0.1)
print(0.1 + 0.2)
print(0.1 + 0.3)
print(0.1 + 0.4)
print(0.1 + 0.5)
print(0.1 + 0.6)
print(0.1 + 0.7)
print(0.1 + 0.8)
print(0.1 + 0.9)
[실행 결과]
0.2 |
어떤가요? 컴퓨터로 계산하면 뭐든지 정확하게 나올 것 같았는데 몇몇 부동 소수점 수의 덧셈 결과는 예상과 다릅니다.
컴퓨터는 모든 데이터를 0과 1만 사용해서 처리한다는 것을 들어보셨죠? 이렇게 수를 0과 1만으로 처리하는 것을 2진법이라고 합니다.
숫자 데이터 역시 0과 1만 사용해서 수를 표현하고 필요한 계산을 합니다. 여기서 문제는 모든 정수는 2진법으로 정확히 표현되는데, 부동 소수점 수는 2진법으로 표현하면 약간의 오차가 발생할 수 있다는 거죠. 이는 2진법을 이용해서 부동 소수점 수를 처리하는 방식에 한계가 있기 때문에 나타나는 결과입니다. 숫자 데이터를 계산한 결과가 부동 소수점 수인 경우, 그 결괏값을 다른 숫자 데이터와 비교(같다, 크다, 작다 등)할 때만 조심하면 큰 문제 없이 처리할 수 있습니다.
마지막으로 정리를 해보자면,
- 컴퓨터는 숫자 데이터를 정수와 부동 소수점 수, 이렇게 두 가지로 분류합니다.
- 부동 소수점 수의 계산 결괏값은 예상과 다를 수 있기 때문에 항상 주의를 기울여야 합니다.
- 부동 소수점 수의 덧셈은 예상한 값과 약간의 오차가 발생할 수 있습니다.
- 부동 소수점 수의 크기를 비교할 때는 조심해야 합니다.
그렇다면 숫자 데이터 0.0은 정수일까요? 부동 소수점 수일까요? 직접 코딩하면서 결과를 확인해 보세요.
print(type(0.0))
print(type(0)
- 숫자 데이터 덧셈의 함정
혼자 공부하는 첫 프로그래밍 with 파이썬이 입문자의 눈높이에 맞춰 인공지능 등 최신 기술을 소개하며 더욱 유익한 내용으로 업그레이드되었습니다.
<좀 더 알아보기>에 생성AI를 활용해 코딩하는 방법을 소개하는 내용이 추가되어 더욱 흥미롭게 프로그래밍의 세계를 탐험할 수 있습니다. 한발 더 나아가 <레벨 업>의 예제와 <도전 문제>를 풀며 응용력까지 챙겨보세요!
👀 도서 자세히 보기
✍️ 유튜브 강의
🙋 문현일 저자님과 함께하는 오픈 채팅방
Leave A Comment