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의 숫자 모델과 유사합니다. 서로 관련 없는 여러 숫자 타입이 존재하며, 숫자 타입 간의 연산이 요청되면 강제 변환(coercion)이 일어납니다. 숫자 모델에 대한 C의 근거는 하드웨어 수준에서 일어나는 일과 매우 유사하다는 것이지만, 그 근거는 Python에는 적용되지 않습니다. 그래서 2/3 == 0이 C 프로그래머에게는 받아들일 만한 것이지만, 많은 Python 프로그래머에게는 놀라운 일입니다.
참고: 뉴스그룹에서 최근 있었던 논의에 비추어, 이 PEP의 동기(와 세부사항)는 확장될 필요가 있습니다.
근거
사용성 연구에서 Python의 사용성이 가장 떨어지는 측면 중 하나는 정수 나눗셈이 나눗셈의 바닥값(floor)을 반환한다는 사실이었습니다. 이는 코드의 여러 부분에서 float()로의 형변환을 요구하게 만들어, 올바르게 프로그래밍하기 어렵게 합니다. Python의 숫자 모델은 C에서 유래했지만, 더 다루기 쉬운 모델은 숫자에 대한 수학적 이해에 기반할 수 있습니다.
다른 숫자 모델들
Perl의 숫자 모델은 숫자에 부동소수점 숫자라는 하나의 타입만 있다는 것입니다. 이는 일관성이 있고 겉보기에는 놀랍지 않지만, 미묘한 함정을 품고 있는 경향이 있습니다. 그중 하나는 숫자를 출력하는 것이 매우 까다로우며 올바른 반올림이 필요하다는 것입니다. Perl에는 모든 숫자가 정수인 모드도 있습니다. 이 모드 또한 나름의 문제를 안고 있는데, 숫자를 나누어 의미 있는 답을 얻을 근사적인 방법조차 없다는 사실에서 비롯됩니다.
Python 숫자 모델을 위한 제안 인터페이스
부가 타입과 클래스에 대해서는 강제 변환(coercion) 규칙이 유지되겠지만, 내장 타입 시스템에는 숫자라는 Python 타입이 정확히 하나만 존재하게 됩니다. “숫자 메서드”로 간주될 수 있는 것에는 여러 가지가 있습니다:
isnatural()isintegral()isrational()isreal()iscomplex()isexact()
당연히 1번부터 5번까지의 질문에 참으로 답하는 숫자는 그 이후의 어떤 질문에도 참으로 답할 것입니다. isexact()가 참이 아니라면, 어떤 답이든 틀릴 수 있습니다. (하지만 심하게 틀리지는 않으며, 진실에 가깝습니다.)
이제, 필드 연산(+, -, /, *)에 대해 이 모델이 보장하는 두 가지가 있습니다:
- 두 피연산자가 모두
isexact()를 만족하면, 결과도isexact()를 만족합니다. isexact()가 아닌 숫자에 대해서는 근사적으로만 참일 수 있다는 점을 제외하면, 모든 필드 규칙은 참입니다.
이 두 규칙의 한 가지 귀결은 모든 정확한 계산이 (복소) 유리수로 수행된다는 것입니다: 필드 법칙이 성립해야 하므로, 다음이
(a/b)*b == a
성립해야 합니다.
숫자를 받아 좋은 근사값인 부정확한 숫자를 반환하는 내장 함수 inexact()가 있습니다. 부정확한 숫자는 IEEE-754를 사용하는 경우와 최소한 동일한 정도의 정확도를 가져야 합니다.
기존의 여러 파이썬 함수는 부정확한 숫자를 받더라도 정확한 숫자를 반환합니다. 예를 들어 int()가 그렇습니다.
강제 변환
숫자 타입은 nb_coerce를 정의하지 않습니다. 모든 숫자 연산 슬롯은 PyNumber가 아닌 것을 받으면 구현을 거부합니다.
부정확한 연산
math 모듈의 함수들은 정확한 값에 대해 부정확한 결과를 반환하는 것이 허용됩니다. 그러나 실수가 아닌 값을 반환하는 일은 결코 없습니다. cmath 모듈의 함수들 또한 정확한 인자에 대해 부정확한 결과를 반환하는 것이 허용되며, 더 나아가 실수 인자에 대해 복소수 결과를 반환하는 것도 허용됩니다.
수치 파이썬 관련 문제
Numerical Python을 사용하는 사람들은 고성능 벡터 연산을 위해 이를 사용합니다. 따라서 NumPy는 하드웨어 기반의 숫자 모델을 유지해야 합니다.
미해결 문제
어떤 숫자 리터럴이 정확하고, 어떤 것이 부정확해야 합니까?
IEEE 754 연산은 어떻게 처리해야 합니까? (아마도 isnan/isinf는 메서드여야 할 것입니다)
64비트 머신에서는 int와 float 간의 비교가 float로의 변환을 수반할 경우 잘못될 수 있습니다. long과 float 간의 비교도 마찬가지입니다. 이는 float로의 변환을 피함으로써 처리할 수 있습니다. (Andrew Koenig에 의함)
Copyright
This document has been placed in the public domain.