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

Python 개선 제안 한국어 번역

PEP 754 – IEEE 754 부동소수점 특수 값

Author:
Gregory R. Warnes <gregory_r_warnes at groton.pfizer.com>
Status:
Rejected
Type:
Standards Track
Created:
28-Mar-2003
Python-Version:
2.3
Post-History:


Table of Contents

번역·라이선스 안내

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

거부 공지

이 PEP는 거부되었습니다. 4년 동안 열려 있었지만, 커뮤니티의 관심을 충분히 끌어내지 못했습니다.

이 PEP의 몇 가지 아이디어는 Python 2.6에 구현되었습니다. 이제 float('inf')와 repr(float('inf'))는 IEEE 754 의미 체계를 따르는 모든 지원 플랫폼에서 동작이 보장됩니다. 그러나 inf와 nan을 직접 정의하지 않는 한 eval(repr(float('inf'))) 왕복 변환은 여전히 지원되지 않습니다:

>>> inf = float('inf')
>>> inf, 1E400
(inf, inf)
>>> neginf = float('-inf')
>>> neginf, -1E400
(-inf, -inf)
>>> nan = float('nan')
>>> nan, inf * 0.
(nan, nan)

math 모듈과 sys 모듈에도 sys.float_info, math.isinf, math.isnan, math.copysign이라는 추가 기능이 생겼습니다.

초록

이 PEP는 IEEE 754 배정밀도 특수 값인 양의 무한대, 음의 무한대, 숫자가 아님(NaN)을 생성하고 검사하는 API를 제안하고 참조 모듈을 제공합니다.

근거

IEEE 754 표준은 부동 소수점 산술을 위한 이진 표현과 알고리즘 규칙의 집합을 정의합니다. 이 표준에는 양의 무한대, 음의 무한대, 그리고 부정(不定)이거나 숫자가 아닌 결과(NaN)를 비롯한 특수 값을 표현하기 위한 상수 집합이 포함되어 있습니다. (Ultra)SPARC, PowerPC, x86 프로세서 계열을 비롯한 대부분의 최신 CPU는 IEEE 754 표준을 구현합니다.

현재 Python에서 IEEE 754 특수 값을 처리하는 방식은 하부 C 라이브러리에 따라 달라집니다. 안타깝게도 이러한 값을 처리하는지, 또 어떻게 처리하는지는 C 라이브러리마다 일관성이 거의 없습니다. 예를 들어 어떤 시스템에서는 “float(‘Inf’)”가 양의 무한대를 나타내는 IEEE 754 상수를 올바르게 반환합니다. 그러나 많은 시스템에서는 이 표현식이 대신 오류 메시지를 발생시킵니다.

IEEE 754 특수 값의 출력 문자열 표현 또한 플랫폼마다 다릅니다. 예를 들어 오버플로를 일으킬 만큼 큰 “float(1e3000)” 표현식은 IEEE 754 양의 무한대에 해당하는 문자열 표현을 반환해야 합니다. x86 Debian Linux의 Python 2.1.3은 “inf”를 반환합니다. Python 2.2.1을 사용하는 Sparc Solaris 8에서는 같은 표현식이 “Infinity”를 반환하고, Active Python 2.2.1을 사용하는 MS-Windows 2000에서는 “1.#INF”를 반환합니다.

더욱 혼란스러운 점은, 일부 플랫폼이 부동소수점에서 변환할 때 생성하는 문자열과 부동소수점으로 변환할 때 받아들이는 문자열이 서로 다르다는 것입니다. 이러한 시스템에서는

float(str(x))

“x”가 IEEE 특수 값일 때 오류를 발생시킵니다.

과거에 일부 사람들은 프로그래머에게 다음과 같은 표현식을 사용하도록 권장했습니다:

PosInf = 1e300**2
NaN = PosInf/PosInf

이는 양의 무한대와 숫자가 아님(NaN) 상수를 얻기 위한 것입니다. 그러나 첫 번째 표현식은 현재의 Python 인터프리터에서 오류를 발생시킵니다. 가능한 대안은 다음을 사용하는 것입니다:

PosInf = 1e300000
NaN = PosInf/PosInf

이 방법은 현재의 Python 인터프리터에서 오류를 발생시키지는 않지만, 여전히 보기 흉하고 이식성이 없을 수 있는 편법입니다. 또한 이런 방식으로 NaN을 정의하면 그러한 값을 감지하는 문제가 해결됩니다. 첫째, IEEE 754 표준은 숫자가 아님(NaN)을 나타내는 상수 값의 집합 전체를 규정합니다. 둘째, 표준은 다음을 요구합니다

NaN != X

NaN을 포함한 X의 가능한 모든 값에 대해 성립합니다. 그 결과

NaN == NaN

항상 거짓으로 평가되어야 합니다. 그러나 이 동작 역시 일관되게 구현되어 있지 않습니다. [예: Cygwin Python 2.2.2]

IEEE 특수 값을 처리하는 방식이 플랫폼과 라이브러리마다 일관되지 않은 경우가 많기 때문에, 비트 패턴을 직접 조작하지 않고서는 일반적인 Python 코드에서 IEEE 754 부동소수점 값을 일관되게 설정하거나 감지할 수 없습니다.

이 PEP는 표준 Python API를 제안하고, 지원되는 모든 플랫폼에서 IEEE 754 특수 값을 일관되게 처리할 수 있게 해 주는 참조 모듈 구현을 제공합니다.

API 정의

상수

NaN
시그널을 발생시키지 않는(non-signalling) IEEE 754 “Not a Number”(숫자 아님) 값
PosInf
IEEE 754 양의 무한대 값
NegInf
IEEE 754 음의 무한대 값

함수

isNaN(value)
인자가 IEEE 754 NaN(Not a Number) 값인지 판별합니다.
isPosInf(value)
인자가 IEEE 754 양의 무한대 값인지 판별합니다.
isNegInf(value)
인자가 IEEE 754 음의 무한대 값인지 판별합니다.
isFinite(value)
인자가 유한한 IEEE 754 값인지(즉, NaN, 양의 무한대, 음의 무한대가 아닌지) 판별합니다.
isInf(value)
인자가 무한한 IEEE 754 값(양의 무한대 또는 음의 무한대)인지 판별합니다

예시

(Solaris 8에서 Python 2.2.1로 실행한 결과입니다.)

>>> import fpconst
>>> val = 1e30000 # should be cause overflow and result in "Inf"
>>> val
Infinity
>>> fpconst.isInf(val)
1
>>> fpconst.PosInf
Infinity
>>> nval = val/val # should result in NaN
>>> nval
NaN
>>> fpconst.isNaN(nval)
1
>>> fpconst.isNaN(val)
0

구현

참조 구현은 “fpconst” 모듈 [1]로 제공되며, 이 모듈은 “struct” 표준 모듈을 활용하여 IEEE 754 특수 값을 정의하는 비트 패턴을 직접 설정하거나 검사하는 방식으로 순수 Python으로 작성되었습니다. 빅 엔디언 머신과 리틀 엔디언 머신 모두에서 올바른 결과를 생성하도록 주의를 기울였습니다. 현재 구현은 순수 Python으로 작성되었지만, 핵심 루틴을 C로 옮기면 효율을 어느 정도 높일 수 있습니다.

SourceForge의 패치 1151323 “New fpconst module” [2]는 fpconst 모듈을 Python 표준 라이브러리에 추가합니다.

참고 문헌

IEEE 754 부동소수점 표준에 관한 참고 자료는 http://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html 을 참조하십시오.