파이썬의 오사오입 - [백준 4434번 평균은 넘겠지]

2023. 6. 21. 18:14·코딩 공부/TIL(Today I Learn)

백준 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(Today I Learn)' 카테고리의 다른 글

[빠른 C++][백준 15552] 빠른 A+B  (0) 2023.07.15
[TIL][C++] Lvalue 와 Rvalue  (0) 2023.07.12
깃 과 깃 허브 기초 명령어  (0) 2023.03.15
[TIL] 유니티 기초 1  (0) 2023.03.08
[TIL] 레퍼런스, 동적할당 그리고 운영체제  (0) 2023.03.08
'코딩 공부/TIL(Today I Learn)' 카테고리의 다른 글
  • [빠른 C++][백준 15552] 빠른 A+B
  • [TIL][C++] Lvalue 와 Rvalue
  • 깃 과 깃 허브 기초 명령어
  • [TIL] 유니티 기초 1
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
        • 일기
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
        • 책
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

    ~
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
파이썬의 오사오입 - [백준 4434번 평균은 넘겠지]
상단으로

티스토리툴바