부정수

Subnormal number
증원되지 않은 부동 소수점 시스템은 정규화된 숫자만 포함할 수 있다(빨간색으로 표시).비문명화된 숫자(파란색)를 허용하면 시스템의 범위가 확장된다.

컴퓨터 공학에서, 보통 이하의 숫자는 부동 소수점 산술에서 0 주위에 있는 저유량 격차를 메우는 데 사용되는 변별화된 숫자(데노말이라고도 함)의 하위 집합이다.최소 정규수보다 작은 크기를 가진 0이 아닌 숫자는 정규수보다 작다.

사용 참고: 일부 이전 문서(특히 IEEE 754의 초기 릴리스 및 C 언어와 같은 표준 문서)에서는 "모범적"이 보통 이하의 숫자를 독점적으로 참조하기 위해 사용된다.이러한 용도는 다양한 표준 문서에서 계속 유지되며, 특히 다른 표준화 숫자를 나타낼 수 없는 하드웨어를 논의할 때 사용되지만, 여기에서 논의되는 용어는 2008년 IEEE 754 개정판에 따라 하위 정규 용어를 사용한다.

정상 부동 소수점 값에서는 유의점(만티사)에 선행 0이 없다. 오히려 선행 0은 지수를 조정하여 제거된다(예를 들어, 숫자 0.0123은 1.23 × 10으로−2 기록된다).반대로, 변위된 부동소수 값은 선행 자릿수가 0인 유의성을 가진다.이 중, 정규화된 경우 최소 표현 가능한 지수(범위가 제한된 지수)보다 낮은 지수를 갖는 값을 나타내는 부호수.

IEEE 부동 소수점 번호의 의의와(또는 맨티사)는 유의한 숫자를 나타내는 부동 소수점 번호의 부분이다.양수 정규화 숫자의 경우0 00 아닌 m.mmm123...mmp−2p−1(여기서 m은 유의한 자릿수를 나타내며 p는 정밀도)로 나타낼 수 있다.2진수 라디스의 경우 선행 2진수 자릿수는 항상 1이다.평균 이하의 숫자에서 지수가 될 수 있는 최소값이기 때문에 0은 선행 유의 자릿수(0.mmm123...mmp−2p−1)로, 가장 작은 정규 숫자보다 0에 가까운 숫자를 나타낼 수 있다.부동 소수점 숫자는 그 지수가 가능한 최소값이 될 때마다 보통 이하의 값으로 인식될 수 있다.

이처럼 언더플로우 간격을 채움으로써 유의한 자릿수가 손실되지만, 플러시 언더플로우 접근법(언더플로우 도달 시 모든 유의한 자릿수가 삭제됨)을 사용할 때와 같이 갑작스럽지는 않다.따라서 결과가 작을 때 계산이 천천히 정밀도를 상실할 수 있기 때문에 보통 이하의 수의 생성을 점진적인 언더플로라고 부르기도 한다.

IEEE 754-2008에서 데노멀 번호는 보통 이하의 숫자로 이름이 바뀌며 이진수와 십진수 형식으로 모두 지원된다.2진수 교환 형식에서, 보통 이하의 숫자는 편향된 지수 0으로 인코딩되지만, 1보다 큰 최소 허용 지수 값(즉, 1로 인코딩된 것처럼)으로 해석된다.십진수 교환 형식에서는 이 형식이 직접 정규화되지 않은 숫자를 지원하므로 특별한 인코딩을 필요로 하지 않는다.

수학적으로 말하면, 주어진 기호의 정규화된 부동 소수점 번호는 대략 로그상 간격이며, 이와 같이 유한한 크기의 정상 부유물은 0을 포함할 수 없다.부정규격 부유물은 음정규격 부유물과 양정규격 부유물 사이의 간격에 걸쳐 있는 선형 간격의 값 집합이다.

배경

보통 이하의 숫자는 부동소수 숫자의 추가와 뺄셈이 결코 과소 흐름은 없다는 것을 보장한다; 근처의 두 부동소수 숫자는 항상 0이 아닌 차이를 나타낸다.점진적인 과소 유동이 없다면, a - b 감산은 과소 유량이 될 수 있고 값이 같지 않더라도 0을 산출할 수 있다.이는 다시 점진적인 저유량을 사용할 때 발생할 수 없는 오류 제로 때문에 분할로 이어질 수 있다.[1]

IEEE 754 표준이 작성되고 있는 동안, Intel 8087에서 보통 이하의 숫자가 구현되었다.그것들은 결국 채택된 K-C-S 형식 제안에서 단연코 가장 논란이 많은 특징이었지만,[2] 이번 이행은 실제 이행에서 보통 이하의 숫자가 뒷받침될 수 있음을 보여주었다.일부 부동 소수점 단위의 구현은 하드웨어에서 직접 보통 이하의 숫자를 지원하지 않고, 오히려 어떤 종류의 소프트웨어 지원을 함정에 빠뜨린다.이것은 사용자에게 투명할 수 있지만, 정상 이하의 숫자를 생산하거나 소비하는 계산은 정상 숫자의 유사한 계산보다 훨씬 느리게 나타날 수 있다.

성능 문제

일부 시스템은 하드웨어에서 정상 값과 동일한 방식으로 최소 정규 값을 처리한다.다른 사람들은 보통 이하의 값의 취급은 시스템 소프트웨어("assist")에 맡기고, 정상 값과 하드웨어의 0만을 취급한다.소프트웨어에서 보통 이하의 값을 취급하면 항상 성능이 현저하게 저하된다.하위 정규 값을 하드웨어에서 완전히 계산하는 경우, 구현 기법은 정상 숫자와 유사한 속도로 처리할 수 있도록 한다.[3]그러나 계산 속도는 현대의 많은 x86 프로세서에서 현저히 감소된 상태로 남아 있다. 극단적인 경우, 정상 이하의 피연산자와 관련된 지침은 최대 100회의 추가 클럭 사이클이 소요될 수 있으며, 이로 인해 가장 빠른 명령이 최대 6배 더 느리게 실행될 수 있다.[4][5]

이 속도 차이는 보안 위험이 될 수 있다.연구원들은 악의적인 웹 사이트가 웹 브라우저 내의 다른 사이트에서 페이지 콘텐츠를 추출할 수 있는 타이밍 사이드 채널을 제공한다는 것을 보여주었다.[6]

일부 애플리케이션은 정확성을 유지하거나 일부 프로세서의 성능 저하를 피하기 위해 보통 이하의 숫자를 피하기 위해 코드를 포함해야 한다.예를 들어, 오디오 프로세싱 애플리케이션에서, 보통 최소값은 인간의 청력 범위를 벗어날 정도로 매우 조용한 신호를 나타낸다.이 때문에 성능 저하가 있는 프로세서에서 서브노멀을 피하기 위한 일반적인 방법은 일단 서브노멀 레벨에 도달하거나 극도로 조용한 노이즈 신호에 혼합된 신호를 0으로 줄이는 것이다.[7]그 밖의 미정수 방지 방법으로는 DC 오프셋 추가, 숫자 정량화, 나이키스트 신호 추가 등이 있다.[8]SSE2 프로세서 확장 이후 인텔은 CPU 하드웨어에서 그러한 기능을 제공했는데, 이 기능은 보통 이하의 숫자를 0으로 반올림한다.[9]

코드 수준에서 하위 정규 부동 소수점

인텔 SSE

인텔의 C와 Fortran 컴파일러는DAZ(노멀-아레-제로) 및FTZ(flush-to-zero) SSE 플래그(기본적으로 다음보다 높은 최적화 수준)-O0.[10] 의 영향DAZ부동 소수점 연산에 대한 최소 정규 입력 인수를 0으로 처리하고, 이 인수의 효과FTZ입력 인수가 그 자체가 보통 이하가 아닐지라도, 조작에 대해 0을 반환하는 것이다. clanggcc는 플랫폼과 최적화 수준에 따라 다양한 기본 상태를 가지고 있다.

C99를 준수하지 않는 방법DAZ그리고FTZSSE를 지원하는 대상의 깃발은 아래에 제공되지만 널리 지원되지는 않는다.적어도 2006년부터 맥 OS X에서 작동하는 것으로 알려져 있다.[11]

#include <fenv.h> #pragma STDC FENV_Access ON // 다른 CSR 설정을 방해하는 DAZ 및 FTZ 설정. // https://opensource.apple.com/source/Libm/Libm-287.1/Source/Intel/, fenv.c 및 fenv.h를 참조하십시오. 공상.(FE_DFL_DISABLE_SSE_DENOMS_ENV); // fesetenv(FE_DFL_ENV) // 둘 다 비활성화하여 다른 CSR 설정을 방해한다. 

C 라이브러리가 아직 이 플래그를 구현하지 않은 다른 x86-SSE 플랫폼의 경우 다음이 적용될 수 있다.[12]

#include <xmmintrin.h> _mm_setcsr(_mm_getcsr()   0x0040);  // DAZ _mm_setcsr(_mm_getcsr()   0x8000);  // FTZ _mm_setcsr(_mm_getcsr()   0x8040);  // 둘 다 _mm_setcsr(_mm_getcsr() & ~0x8040); // 둘 다 사용 안 함 

_MM_SET_DENORMALS_ZERO_MODE그리고_MM_SET_FLUSH_ZERO_MODE매크로가 위의 코드에 대해 더 읽기 쉬운 인터페이스를 감싼다.[13]

// DAZ를 활성화하려면 다음과 같이 하십시오. #include <pmmintrin.h> _MM_SET_DENORMAL_ZERO_MODE(_MM_DENORMAL_ZERO_켜기); // FTZ를 사용하려면 #include <xmmintrin.h> _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_켜기); 

대부분의 컴파일러는 기본적으로 이미 이전 매크로를 제공할 것이다. 그렇지 않으면 다음과 같은 코드 조각이 사용될 수 있다(FTZ에 대한 정의는 유사하다).

#define _MM_DENORMAL_ZERO_MASK 0x0040 #define _MM_DENORMAL_ZERO_ON 0x0040 #define _MM_DENORMAL_ZERO_OFF 0x0000  #define _MM_SET_DENORMAL_ZERO_MODE(모드)_mm_setcsr((_mm_getcsr()) &_MM_DENOMAL_ZERO_MASK) (모드) #define _MM_GET_DENORMAL_ZERO_MODE() (_MM_GETCSr() & _MM_DENORMAL_ZERO_MASK) 

기본 탈원형 동작은 ABI가 명령하므로, 잘 동작하는 소프트웨어는 다른 라이브러리에서 발신자에게 돌아가거나 전화 코드를 호출하기 전에 탈원형 모드를 저장 및 복원해야 한다.

AArch32 NEON (SIMD) FPU는 항상 flash-to-zero 모드를 사용한다.FTZ + DAZ. 스칼라 FPU와 AArch64 SIMD의 경우 플러시-제로 동작은 선택 사항이며 에 의해 제어된다.FZ제어 레지스터 비트 – Arm32의 FPSCR 및 AArch64의 FPCR.

일부 ARM 프로세서는 하위 표준의 하드웨어 처리를 가지고 있다.

참고 항목

참조

  1. ^ William Kahan. "IEEE 754R meeting minutes, 2002". Archived from the original on 15 October 2016. Retrieved 29 December 2013.
  2. ^ "An Interview with the Old Man of Floating-Point". University of California, Berkeley.
  3. ^ Schwarz, E.M.; Schmookler, M.; Son Dao Trong (July 2005). "FPU Implementations with Denormalized Numbers" (PDF). IEEE Transactions on Computers. 54 (7): 825–836. doi:10.1109/TC.2005.118. S2CID 26470540.
  4. ^ Dooley, Isaac; Kale, Laxmikant (2006-09-12). "Quantifying the Interference Caused by Subnormal Floating-Point Values" (PDF). Retrieved 2010-11-30.
  5. ^ Fog, Agner. "Instruction tables: Lists of instruction latencies, throughputs and microoperation breakdowns for Intel, AMD and VIA CPUs" (PDF). Retrieved 2011-01-25.
  6. ^ Andrysco, Marc; Kohlbrenner, David; Mowery, Keaton; Jhala, Ranjit; Lerner, Sorin; Shacham, Hovav. "On Subnormal Floating Point and Abnormal Timing" (PDF). Retrieved 2015-10-05.
  7. ^ Serris, John (2002-04-16). "Pentium 4 denormalization: CPU spikes in audio applications". Archived from the original on February 25, 2012. Retrieved 2015-04-29.
  8. ^ de Soras, Laurent (2005-04-19). "Denormal numbers in floating point signal processing applications" (PDF).
  9. ^ Casey, Shawn (2008-10-16). "x87 and SSE Floating Point Assists in IA-32: Flush-To-Zero (FTZ) and Denormals-Are-Zero (DAZ)". Retrieved 2010-09-03.
  10. ^ "Intel® MPI Library – Documentation". Intel.
  11. ^ "Re: Macbook pro performance issue". Apple Inc. Archived from the original on 2016-08-26.
  12. ^ "Re: Changing floating point state (Was: double vs float performance)". Apple Inc. Archived from the original on 2014-01-15. Retrieved 2013-01-24.
  13. ^ "C++ Compiler for Linux* Systems User's Guide". Intel.

추가 읽기

  • 계산 결과를 개선하는 데 도움이 되는 최소 정규 숫자의 예는 윌리엄 카한의 웹 사이트 [1]에 있는 다양한 문서를 참조하십시오.