2013-04-29 5 views
1

ISO/IEC 9899 2011 §5.2.4.2.2 ¶10 (P48)를 말한다"컴파일러가 비표준 부동 소수점을 구현하지 않을 수도 있습니다"의 중요성은 무엇입니까?

비정규 숫자의 유무 FLT_HAS_SUBNORM, DBL_HAS_SUBNORM, 및 LDBL_HAS_SUBNORM의 구현 - 정의 된 값을 특징으로 :

-1 불확정
0 없음 (형식이 비정상 숫자를 지원하지 않음)
1 현재 (형식이 비정상 숫자를 지원합니다)

무엇을! 그래서 일부 플랫폼에서는 쓸 수 없습니다 double d = 33.3? 아니면 컴파일러가 자동으로 이것을 333E-1으로 변환합니까? 정규화되지 않은 부동 소수점 숫자의 유무에 대한 실질적인 중요성은 무엇입니까?

+3

[비정규 번호] (http://en.wikipedia.org/wiki/Denormal_number)가 무엇인지 이해해야합니다. –

+2

33.3 또는 333E-2는 부동 소수점 산술의 정상적인 구현에서 비정상적인 숫자가 아닙니다. IEEE 754 부동 소수점 산술을 사용한다고 가정하면, 보통 수는 지수가 가능한 가장 작은 지수와 같고 일반 숫자처럼 1 비트 대신 0 비트로 시작하는 가수를가집니다. 선두의 1 비트는 일반적으로 함축적입니다. 그것은 물리적으로 저장되지 않습니다. 비정상 숫자는 작다. –

답변

7

비정규 번호 및 -DBL_MIN 및 (유형 double 용) DBL_MIN (유형 float 용) 및 -FLT_MINFLT_MIN 사이 제로 부동 소수점 수이다. 상수 FLT_MIN은 일반적으로 1.17549435E-38F, 즉 입니다. 부동 소수점 숫자가있는 약간의 프로그래밍을 수행하는 경우 은 비정상적인 숫자을 만난 적이 없습니다.

FLT_HAS_SUBNORM == 0이있는 컴파일 플랫폼에는 숫자 +0 만 있습니다. 및 -0. -FLT_MINFLT_MIN 사이

비정상 숫자는 일반적으로 예외적 인 동작을 나타내며 자주 발생하지 않으므로 소프트웨어에서 처리됩니다. 그 (것)들을 전혀 취급하지 않는 1 가지의 이유는 일어날 때 발생할 수있는 감속을 피하기위한 것이다. 이는 실시간 상황에서 중요 할 수 있습니다.

다음 인텔 데스크탑 프로세서 세대 (또는 현재입니까?) 하드웨어의 서브 노드를 처리합니다.

비정규 숫자의 개념은 double 값을 나타내는 33.3333E-1과는 관계가 없습니다.

하위 천칭에 대한 정당화 및 IEEE 754 표준화의 역사는 Kahan의 "Gradual Underflow"에서 reminiscences에 나와 있습니다.

편집 : 인텔 프로세서의 차세대 하드웨어에 subnormals을 처리하기위한 소스를 찾을 수 없습니다,하지만 난 Nvidia's Fermi platform doing so already 하나를 발견

.

+2

+1 링크! –

+1

작은 quibble : '33.3'과 '333E-1'은 동일한 'double'* value *를 나타내는 두 개의 다른 부동 소수점 리터럴입니다. –

+0

@KeithThompson 감사. –