C ++ 표준은 플로트 유형의 값 범위를 어디에서 정의합니까?
-
08-07-2019 - |
문제
내가 아는 한 플로팅 포인트 값은 n * 2^e 형태입니다.
- 플로트 범위는 n = -(2^23-1) -(2^23-1), e = -126-127입니다.
- 이중 범위는 n = -(2^52-1) -(2^52-1) 및 e = -1022-1023입니다.
나는 C ++ 표준을 살펴보고 있었지만 표준이이를 지정하는 장소를 찾지 못했거나, 다른 (IEEE) 표준으로 정의 된 범위와 플로트, 이중 및 긴 이중 유형의 연관성을 의무화하지 못했습니다. 3.9.1.8에서 찾은 유일한 관련 사항은 다음과 같습니다.
플로트, 더블 및 긴 더블의 세 가지 부동 소수점 유형이 있습니다. 이중 유형은 플로트만큼 최소한 정밀도를 제공하며, 유형의 긴 이중은 최소한 이중만큼 정밀도를 제공합니다. 유형 플로트의 값 세트는 유형 값의 값 세트의 서브 세트입니다. 이중 유형 값 세트는 유형의 값 값 세트의 서브 세트입니다. 부동 소수점 유형의 값 표현은 구현 정의입니다.
그리고 유형이 제공하는 최소 범위에 대한 언급이 없습니다.
플로팅 포인트 유형의 (최소?) 값 범위를 어디서/어떻게 지정합니까? 아니면 컴파일러가 값 범위를 자유롭게 선택하고 여전히 표준 준수 할 수 있습니까?
해결책
정수 번호 한계와 마찬가지로 한계 float
, double
그리고 long double
C 표준에서 가져옵니다. 상수의 최소값 FLT_MAX
, DBL_MAX
그리고 LDBL_MAX
~이다 1E+37
. 그들의 *_MIN
변형 최대 값은입니다 1E-37
.
다른 팁
당신이 인용 한 것은 C ++의 부동 소수점 유형에 대해 보장되는 모든 것입니다. 말했듯이, 그들의 표현은 구현 정의입니다.
그러나 한계에 대한 정보와 유형이 IEC 559 (IEEE 754) 지정된 유형인지 여부에 대한 정보는 std::numeric_limits
템플릿 <limits>
.
표준은 종종 하드웨어 의존적이며 시간이 지남에 따라 변경되기 때문에 이러한 것들을 지정하지 않습니다. 오늘날 32 비트는 표준으로 간주되지만 10 년 안에 64 비트 미만의 일을하는 것은 불쾌한 것처럼 보일 수 있습니다.