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:
번역·라이선스 안내
이 비공식 한국어 번역은 원문 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 배정밀도 특수 값인 양의 무한대, 음의 무한대 및 숫자가 아님(Not-a-Number, NaN)을 생성하고 테스트하는 API와 참조 모듈을 제안합니다.
근거
IEEE 754 표준은 부동 소수점 산술을 위한 이진 표현과 알고리즘 규칙의 집합을 정의합니다. 이 표준에는 양의 무한대, 음의 무한대 및 미정 또는 숫자가 아닌 결과(NaN)를 비롯한 특수 값을 표현하기 위한 상수 집합이 포함되어 있습니다. 대부분의 최신 CPU는 (Ultra)SPARC, PowerPC 및 x86 프로세서 제품군을 포함하여 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
양의 무한대와 숫자가 아님 상수를 얻기 위해서입니다. 그러나 첫 번째 표현식은 현재 Python 인터프리터에서 오류를 생성합니다. 가능한 대안은 다음을 사용하는 것입니다.:
PosInf = 1e300000
NaN = PosInf/PosInf
이것은 현재 Python 인터프리터에서 오류를 생성하지 않지만, 여전히 보기 좋지 않고 이식성이 떨어질 가능성이 있는 해킹입니다. 또한 이러한 방식으로 NaN을 정의해도 그러한 값을 감지하는 문제는 해결되지 않습니다. 첫째, IEEE 754 표준은 숫자가 아님(Not-a-Number)을 나타내는 상수 값의 전체 집합을 제공합니다. 둘째, 표준은 다음을 요구합니다.
NaN != X
NaN을 포함한 X의 가능한 모든 값에 대해 성립합니다. 그 결과
NaN == NaN
항상 거짓으로 평가되어야 합니다. 그러나 이 동작 또한 일관되게 구현되어 있지는 않습니다. [예: Cygwin Python 2.2.2]
IEEE 특수 값을 처리하는 플랫폼과 라이브러리의 많은 불일치로 인해, 비트 패턴을 직접 조작하지 않고서는 일반 Python 코드에서 IEEE 754 부동 소수점 값을 일관되게 설정하거나 감지할 수 없습니다.
이 PEP는 표준 Python API를 제안하고, 지원되는 모든 플랫폼에서 IEEE 754 특수 값을 일관되게 처리할 수 있도록 하는 참조 모듈 구현을 제공합니다.
API 정의
상수
- NaN
- 비신호 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
구현
참조 구현은 “struct” 표준 모듈을 활용하여 IEEE 754 특수 값을 정의하는 비트 패턴을 직접 설정하거나 검사하는 순수 Python 코드로 작성된 “fpconst” 모듈 [1]에서 제공됩니다. 빅 엔디언 및 리틀 엔디언 머신 모두에서 올바른 결과가 생성되도록 주의를 기울였습니다. 현재 구현은 순수 Python으로 작성되었지만, 핵심 루틴을 C로 변환하면 효율성을 어느 정도 높일 수 있습니다.
SourceForge의 패치 1151323 “New fpconst module” [2]는 fpconst 모듈을 Python 표준 라이브러리에 추가합니다.
참고 자료
IEEE 754 부동 소수점 표준에 관한 참고 자료는 http://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html 를 참조하십시오.
Copyright
This document has been placed in the public domain.