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

Python 개선 제안 한국어 번역

PEP 239 – Python에 유리수 타입 추가하기

Author:
Christopher A. Craig <python-pep at ccraig.org>, Moshe Zadka <moshez at zadka.site.co.il>
Status:
Rejected
Type:
Standards Track
Created:
11-Mar-2001
Python-Version:
2.2
Post-History:
16-Mar-2001

Table of Contents

번역·라이선스 안내

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

Warning

This PEP has been rejected.

×

근거 절에서 설명한 요구 사항은 십진 산술을 위한 PEP 327이 채택되면서 어느 정도 해결되었습니다. Guido는 또한 “유리수 산술은 ABC에서 기본 ‘정확한’ 산술이었지만 기대한 대로 되지 않았다”고 언급했습니다. 2005년 6월 17일의 python-dev 논의를 참고하십시오 [1].

추신: “수를 위한 타입 계층”인 PEP 3141이 채택되면서 ‘Rational’ 수치 추상 베이스 클래스가 추가되었고, 그 구체적인 구현이 ‘fractions’ 모듈에 들어갔습니다.

초록

Python에는 무한 정밀도 유리수의 의미를 갖는 숫자 타입이 없습니다. 이 제안은 그러한 타입의 의미를 설명하고, 그러한 타입을 지원하기 위한 내장 함수와 리터럴을 제안합니다. 이 PEP는 유리수를 위한 리터럴을 제안하지 않습니다. 그것은 다른 PEP에 맡깁니다.

근거

유리수 산술은 때때로 더 느리고 메모리를 더 많이 사용하지만(일반적으로 그 정도에 제한이 없습니다), 수의 수학적 이상을 더 가깝게 담아내며 초보자에게 덜 놀라운 동작을 보이는 경향이 있습니다. 유리수의 Python 구현은 많이 작성되었지만, 그중 어느 것도 코어에 포함되어 있지 않으며 어떤 방식으로도 문서화되어 있지 않습니다. 이 때문에 Python에 덜 능숙한 사람들은 이를 훨씬 접하기 어려웠습니다.

RationalType

RationalType이라는 새로운 수치 타입이 추가됩니다. 이 타입의 단항 연산자는 자명한 동작을 수행합니다. 이항 연산자는 정수와 긴 정수를 유리수로, 유리수를 부동소수점 수와 복소수로 강제 변환합니다.

다음 속성이 지원될 것입니다: .numerator와 .denominator. 언어 정의는 다음을 보장합니다.:

r.denominator * r == r.numerator

분자와 분모의 최대공약수(GCD)가 1이고 분모가 양수라는 것입니다.

r.trim(max_denominator) 메서드는 abs(s.denominator) <= max_denominator를 만족하면서 r에 가장 가까운 유리수 s를 반환합니다.

rational() 내장 함수

이 함수의 시그니처는 rational(n, d=1)입니다. n과 d는 모두 정수, 긴 정수 또는 유리수여야 합니다. 다음이 보장됩니다.:

rational(n, d) * d == n

미해결 문제

  • 이 타입의 이름을 rational 대신 rat으로 해야 할 수도 있습니다. 누군가는 complex, real, rational, integer(정수)라는 이름의 “추상적인” 순수 수학 타입들과, float, rat, long, int 같은 이름의 “구체적인” 표현 타입들을 두자고 제안했습니다.
  • 정수 값을 갖는 유리수를 시퀀스 인덱스로 허용해야 합니까? 예를 들어, s[5/3 - 2/3]가 s[1]과 동등해야 합니까?
  • 유리수에 shift와 mask 연산자를 허용해야 합니까? 정수 값을 갖는 유리수에 대해서는 어떻습니까?
  • Marcin ‘Qrczak’ Kowalczyk가 c.l.py에서 int를 유리수와 통합하는 것에 대한 찬반 인자를 잘 정리했습니다.

    int를 유리수와 통합하는 것에 찬성하는 인자:

    • 2 == 2/1이고 어쩌면 str(2/1) == '2'이기도 하므로, 객체가 같아 보이는데도 다르게 동작해서 놀라는 일이 줄어듭니다.
    • 나머지가 없다는 것을 알고 있을 때는 /를 정수 나눗셈에 자유롭게 사용할 수 있습니다(제 생각이 틀려서 나머지가 있다면 아마 나중에 어떤 예외가 발생할 것입니다).

    반대하는 인자:

    • /의 결과를 시퀀스 인덱스로 사용한다면 그것은 대개 오류입니다. 일부 데이터에서는 프로그램이 동작하게 만들어 이 오류를 숨겨서는 안 됩니다. 다른 데이터에서는 프로그램이 제대로 동작하지 않을 것이기 때문입니다.
    • (이는 통합한 뒤에도 int와 유리수가 서로 다른 타입이라고 가정합니다:) 타입이 값에 따라 달라지는 일은 드물어야 합니다. 변수의 타입을 알면 추론하기가 더 쉽습니다. 그 변수를 어떻게 사용할 수 있는지 알기 때문입니다. 어떤 것이 int임을 확인하면, 이 자리에 사용되는 다른 객체들도 int일 것이라고 기대할 수 있습니다.
    • (이는 둘이 같은 타입이라고 가정합니다:) int는 그 자체로 좋은 타입이며, 유리수와 섞여서는 안 됩니다. 어떤 것이 정수라는 사실은 그 타입에 관한 진술로 표현될 수 있어야 합니다. 많은 연산이 int를 요구하며 유리수를 받아들이지 않습니다. 둘을 서로 다른 타입으로 생각하는 것이 자연스럽습니다.

참고 문헌