Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 228 – Python의 수 모델 재설계

Author:
Moshe Zadka <moshez at zadka.site.co.il>, Guido van Rossum <guido at python.org>
Status:
Withdrawn
Type:
Standards Track
Created:
04-Nov-2000
Post-History:


Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

철회

이 PEP는 PEP 3141을 채택하면서 철회되었습니다.

초록

현재 Python의 수 모델은 C의 수 모델과 비슷합니다. 서로 관련 없는 여러 수 타입이 있으며, 수 타입 사이의 연산이 요청되면 강제 변환이 일어납니다. C에서 이러한 수 모델을 택한 근거는 하드웨어 수준에서 일어나는 일과 매우 비슷하다는 것이지만, 그 근거는 Python에는 해당하지 않습니다. 따라서 C 프로그래머에게는 2/3 == 0이 받아들일 만한 일이지만, 많은 Python 프로그래머에게는 놀라운 일입니다.

참고: 최근 뉴스그룹에서 있었던 논의에 비추어 볼 때, 이 PEP의 동기(와 세부 사항)는 보완되어야 합니다.

근거

사용성 연구에서 Python의 가장 사용하기 어려운 측면 중 하나는 정수 나눗셈이 나눗셈 결과의 내림값을 반환한다는 사실이었습니다. 이 때문에 코드 곳곳에서 float()로 형 변환을 해야 하므로 올바르게 프로그래밍하기가 어렵습니다. Python의 수 모델은 C에서 유래했지만, 다루기가 더 쉬울 수 있는 모델은 수에 대한 수학적 이해를 바탕으로 만들 수 있습니다.

다른 숫자 모델

Perl의 수 모델에는 수 타입이 하나뿐인데, 바로 부동소수점 수입니다. 이 모델은 일관적이고 겉보기에는 놀라울 것이 없지만, 미묘한 함정이 있기 마련입니다. 그중 하나는 숫자를 출력하는 일이 매우 까다로우며 올바른 반올림이 필요하다는 점입니다. Perl에는 모든 수가 정수인 모드도 있습니다. 이 모드에도 나름의 문제가 있는데, 이는 수를 나누어 의미 있는 답을 얻는 방법이 근사적으로조차 없다는 사실에서 비롯됩니다.

Python의 수 모델을 위해 제안하는 인터페이스

추가 타입과 클래스에 대해서는 강제 변환 규칙이 유지되지만, 내장 타입 시스템에는 정확히 하나의 Python 타입, 즉 수(number)만 있게 됩니다. “숫자 메서드”로 볼 수 있는 것이 몇 가지 있습니다:

  1. isnatural()
  2. isintegral()
  3. isrational()
  4. isreal()
  5. iscomplex()
  6. isexact()

당연히 1번부터 5번까지의 질문 중 하나에 참으로 답하는 수는 그 뒤에 오는 모든 질문에도 참으로 답합니다. isexact()가 참이 아니면 어떤 답이든 틀릴 수 있습니다. (그렇다고 크게 틀리지는 않으며, 참에 가깝습니다.)

이제 모델은 필드 연산(+, -, /, *)에 대해 두 가지를 약속합니다:

  • 두 피연산자가 모두 isexact()를 만족하면 결과도 isexact()를 만족합니다.
  • 모든 필드 규칙이 참입니다. 다만 isexact()가 아닌 수에 대해서는 근사적으로만 참일 수 있습니다.

이 두 규칙의 한 가지 결과는 모든 정확한 계산이 (복소) 유리수로 수행된다는 것입니다. 필드 법칙이 성립해야 하므로, 다음과 같습니다.

(a/b)*b == a

성립해야 합니다.

숫자를 받아 좋은 근삿값인 부정확한 수를 반환하는 내장 함수 inexact()가 있습니다. 부정확한 수는 적어도 IEEE-754를 사용할 때만큼은 정확해야 합니다.

기존의 몇몇 Python 함수는 부정확한 수를 받더라도 정확한 수를 반환합니다. 예: int().

강제 변환

수 타입은 nb_coerce를 정의하지 않습니다. 모든 수치 연산 슬롯은 PyNumber 이외의 것을 받으면 연산 구현을 거부합니다.

부정확한 연산

math 모듈의 함수들은 정확한 값에 대해 부정확한 결과를 반환해도 됩니다. 그러나 이 함수들은 실수가 아닌 수를 절대 반환하지 않습니다. cmath 모듈의 함수들도 정확한 인자에 대해 부정확한 결과를 반환해도 되며, 나아가 실수 인자에 대해 복소수 결과를 반환해도 됩니다.

Numerical Python 관련 문제

고성능 벡터 연산이 필요한 사람들이 Numerical Python을 사용합니다. 따라서 NumPy는 하드웨어 기반 수치 모델을 유지해야 합니다.

미해결 문제

어떤 수 리터럴을 정확한 수로 하고, 어떤 수 리터럴을 부정확한 수로 하겠습니까?

IEEE 754 연산은 어떻게 처리하겠습니까? (아마도 isnan/isinf는 메서드여야 할 것입니다)

64비트 머신에서는 int와 float를 비교할 때 float로 변환해야 하면 비교 결과가 틀릴 수 있습니다. long과 float 간의 비교도 마찬가지입니다. 이 문제는 float로 변환하지 않으면 해결할 수 있습니다. (Andrew Koenig가 지적했습니다.)