맨위로가기

비정규 값

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

비정규 값은 부동 소수점 수의 표현 방식 중 하나로, 지수가 표현 가능한 가장 작은 값보다 작은 값을 나타낸다. IEEE 754-2008 표준에서는 "비정규 값" 대신 "비정규"라는 용어를 사용한다. 비정규 값은 부동 소수점 연산에서 언더플로우를 방지하고, 점진적 언더플로우를 통해 계산의 정밀도를 유지하는 데 기여한다. 그러나 비정규 값 처리는 시스템 성능 저하를 유발할 수 있으며, 이를 해결하기 위해 하드웨어에서 비정규 값을 처리하거나, 비정규 값을 0으로 처리하는 기법이 사용된다.

더 읽어볼만한 페이지

  • 컴퓨터 산술 - IEEE 754
    IEEE 754는 부동소수점 숫자를 표현하고 처리하기 위한 국제 표준으로, 다양한 형식과 연산, 반올림 규칙, 예외 처리 등을 정의한다.
  • 컴퓨터 산술 - 1의 보수
    1의 보수는 이진수에서 양수는 일반적인 이진수로, 음수는 양수의 각 비트를 반전시켜 표현하며, 덧셈 시 자리올림수가 발생하면 결과값에 더해야 하고, 0을 중복 표현하는 단점으로 현대에는 2의 보수가 주로 사용된다.
비정규 값
일반 정보
이름비정규 수
로마자 표기Bi-jeonggyu su
정의부동소수점 산술에서, 비정규 수는 0이 아닌 유한한 수이지만, 그 크기가 너무 작아서 정규화된 수로 표현할 수 없는 수임.
이들은 지수 필드에 예약된 값을 가지며, 일반적으로는 0임.
표현비정규 수는 정규화된 수와 비교하여 정밀도가 떨어지지만, 0에 더 가까운 값을 표현할 수 있게 해줌.
이는 언더플로우를 방지하고, 일부 계산에서 더 정확한 결과를 얻을 수 있도록 함.
특징
점진적 언더플로우비정규 수를 사용하면 언더플로우가 점진적으로 발생하여, 계산 결과가 갑자기 0으로 바뀌는 것을 방지할 수 있음.
정밀도 손실비정규 수는 정규화된 수보다 적은 유효 자릿수를 가짐.
계산 속도일부 하드웨어에서 비정규 수에 대한 연산은 정규화된 수에 대한 연산보다 느릴 수 있음.
표준
IEEE 754비정규 수는 IEEE 754 부동소수점 표준에 정의되어 있음.
관련 개념
언더플로우언더플로우는 계산 결과가 너무 작아서 표현할 수 없을 때 발생함.
정규화된 수정규화된 수는 부동소수점 수의 일반적인 표현 방식임.
부동소수점부동소수점은 실수를 컴퓨터에서 표현하는 방법 중 하나임.

2. 용어

과거에는 "비정규화(Denormalized)"라는 용어가 비정규화 수를 지칭하는 데 사용되었으나, IEEE 754의 2008년 개정판에 따라 "비정규(Subnormal)"라는 용어로 변경되었다. 일상적인 논의에서는 ''비정상''과 ''비정규''라는 용어가 종종 같은 의미로 사용된다.[16]

2. 1. 정의

비정규화 수는 정규화된 부동소수점 수의 가수(Mantissa) 부분에서 선행하는 0을 가지는 수로, 지수가 표현 가능한 가장 작은 값보다 더 작은 값을 나타낸다.

''정규화된(normal)'' 부동 소수점 값에서는 가수(significand)](mantissa)]에

3. 배경

비정규화 수는 부동 소수점 덧셈과 뺄셈에서 언더플로우가 발생하여 결과가 0이 되는 것을 방지한다. 서로 가까운 두 부동 소수점 숫자는 항상 0이 아닌 차이를 표현할 수 있다. 점진적 언더플로우가 없으면, ''a'' − ''b'' 와 같은 뺄셈에서 두 값이 같지 않아도 언더플로우로 인해 0이 될 수 있다. 이는 0으로 나누기 오류와 같은 예외 상황을 일으킬 수 있다.[1]

비정규 값은 IEEE 754 표준 제정 과정에서 인텔 8087에 처음 구현되었으며, 이후 표준에 채택되었다. 이는 K-C-S 형식 제안에서 가장 논란이 많았던 기능이었지만,[2] 이 구현으로 인해 비정규 값을 실제로 지원할 수 있다는 것이 증명되었다.

3. 1. 점진적 언더플로우 (Gradual Underflow)

IEEE 부동 소수점에서, 연산 결과가 표현 가능한 가장 작은 정규화 수보다 작을 때, 비정규화 수를 사용하여 정밀도를 점차적으로 잃으면서 결과를 표현하는 방식을 점진적 언더플로우(gradual underflow)라고 한다.[16]

정규화된 부동 소수점 값에서는 가수(significand)에 선행 영(leading zero)이 존재하지 않는다. 대신, 지수를 조정하여 선행 영을 제거한다. 예를 들어, 숫자 0.0123은 1.23 x 10-2 로 표기된다. 반면, 비정규화된 부동 소수점 값은 선행 숫자가 0인 가수를 갖는다. 비정규 값(subnormal)은 정규화될 경우 표현 가능한 가장 작은 지수보다 작은 지수를 갖는 값을 나타낸다.

IEEE 754-2008에서는 비정규 값(denormal)이 ''비정규 값(subnormal)''으로 이름이 변경되었으며, 이진 및 십진수 형식 모두에서 지원된다.

이처럼 언더플로우 간극을 채움으로써, 유효 숫자는 손실되지만, ''언더플로우 시 0으로 플러시(flush to zero on underflow)'' 접근 방식(언더플로우에 도달했을 때 모든 유효 숫자를 버림)을 사용할 때만큼 갑작스럽게 손실되지는 않는다. 따라서 비정규 값(subnormal) 숫자의 생성은 때때로 ''점진적 언더플로우(gradual underflow)''라고 불리는데, 이는 결과가 작을 때 계산이 정밀도를 천천히 잃도록 하기 때문이다.

4. 성능 문제

일부 시스템은 정규 값과 마찬가지로 하드웨어에서 비정규 값을 처리하지만, 다른 시스템은 비정규 값 처리를 시스템 소프트웨어에 맡기고 하드웨어에서는 정규 값과 0만 처리한다. 소프트웨어에서 비정규 값을 처리하면 항상 성능이 크게 저하된다. 비정규 값을 하드웨어에서 완전히 계산하더라도, 많은 최신 x86 프로세서에서는 계산 속도가 상당히 감소한다. 극단적인 경우, 비정규 피연산자를 포함하는 명령어는 최대 100 클럭 사이클이나 더 소요될 수 있으며, 이로 인해 가장 빠른 명령어의 실행 속도가 최대 6배까지 느려질 수 있다.[5][6]

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

일부 응용 프로그램은 정확성을 유지하거나 일부 프로세서에서 성능 저하를 피하기 위해 비정규 숫자를 발생시키지 않도록 코드를 작성하기도 한다.

4. 1. 비정규화 수 방지 기법

일부 시스템은 하드웨어에서 비정규 값을 처리하지만, 다른 시스템은 시스템 소프트웨어에 처리를 맡기고 하드웨어는 정규 값과 0만 처리한다. 소프트웨어 처리는 성능 저하를 유발한다. 비정규 값을 하드웨어에서 처리하더라도, 많은 최신 x86 프로세서에서는 계산 속도가 느려질 수 있다. 극단적인 경우, 비정규 피연산자를 포함하는 명령어는 최대 100 클럭 사이클 이상 소요되어, 명령어 실행 속도가 최대 6배까지 느려질 수 있다.[5][6] 이러한 속도 차이는 타이밍 사이드 채널을 통한 보안 위험을 야기할 수 있다.[7]

오디오 처리와 같은 특정 응용 프로그램에서는 비정규화 수를 0으로 자르거나, 매우 조용한 노이즈 신호를 추가하여 비정규화 수 발생을 방지하고 성능 저하를 피한다.[8] 이 외에도 DC 오프셋 추가, 숫자 양자화, 나이퀴스트 신호 추가 등의 방법이 있다.[9] SSE2 이후, 인텔 CPU는 비정규 숫자를 0으로 반올림하는 기능을 하드웨어에서 제공한다.[10]

4. 2. 하드웨어 지원

인텔 SSE2 확장 이후, CPU 하드웨어는 비정규화 수를 0으로 반올림하는 기능을 제공하여[10] 성능 저하 문제를 완화한다. 이 기능은 플러시-투-제로(Flush-to-Zero, FZ, FTZ)라고 불리며, 연산 결과가 gradual underflow를 수행하지 않고 0으로 반올림된다. SSE 이후 확장에는 연산의 피연산자에서 비정규 값을 0으로 반올림하는 Denormals-Are-Zero (DAZ)라는 기능도 있다. 이 두 기능은 control/status register (CSR)의 마스크로 지정할 수 있다.[22]

일부 ARM 프로세서에서도 플러시-투-제로(Flush-to-Zero) 모드를 지원하거나,[8] 제어 레지스터를 통해 비정규화 수 처리 방식을 설정할 수 있다.

5. 코드 레벨에서 비정규화 부동 소수점 비활성화

여러 프로그래밍 언어 및 컴파일러 환경에서 비정규화 부동 소수점 처리를 제어하는 방법을 제공한다.

인텔의 C 및 포트란 컴파일러는 기본적으로 SSE에 대해 DAZ(Denormals-Are-Zero, 비정규치를 0으로) 및 FTZ(Flush-to-Zero, 0으로 플러시) 플래그를 활성화한다. DAZ는 부동 소수점 연산에 대한 비정규 입력 인수를 0으로 처리하고, FTZ는 비정규 부동 소수점이 생성되는 연산에 대해 0을 반환한다. clang 및 gcc는 플랫폼 및 최적화 수준에 따라 기본 상태가 다르다.

AArch32 NEON(SIMD) FPU는 항상 플러시-투-제로 (flush-to-zero) 모드를 사용하며[15], 이는 FTZ + DAZ영어와 동일하다. 스칼라 FPU와 AArch64 SIMD의 경우, 플러시-투-제로 동작은 선택 사항이며, 제어 레지스터의 FZ영어 비트 (Arm32에서는 FPSCR, AArch64에서는 FPCR)에 의해 제어된다.[15]

일부 ARM 프로세서는 서브노멀(subnormals)에 대한 하드웨어 처리를 갖추고 있다.[18][19] 시스템에 따라 비정규 값을 정규 값과 동일한 형태로 하드웨어에서 처리하는 경우가 있는 반면, 구현에 따라 시스템 소프트웨어에 비정규 값 처리를 맡기고 하드웨어에서는 정규 값과 0만 처리하는 경우도 있다. 비정규 값을 소프트웨어로 처리하면 성능이 크게 저하되며, 완전히 하드웨어에서 처리하더라도 현대의 많은 프로세서에서는 계산 성능이 대폭 저하되어 아키텍처에 따라 정규 값의 100배나 시간이 걸리는 경우도 있다.[18][19]

정밀도를 유지하고 성능 저하도 방지할 목적으로, 비정규 값을 발생시키지 않도록 코드를 작성하는 애플리케이션도 있다. 예를 들어 음성 처리 애플리케이션에서는 비정규 값이 신호가 인간의 귀에 들리지 않을 정도로 작을 때 나타나므로, 비정규 값이 된 신호 부분은 0으로 잘라내는 대책을 취하는 것이 일반적이다.[20]

5. 1. 인텔 SSE

인텔의 C 및 포트란 컴파일러는 기본적으로 SSE에 대해 DAZ(Denormals-Are-Zero, 비정규치를 0으로) 및 FTZ(Flush-to-Zero, 0으로 플러시) 플래그를 활성화한다. DAZ는 부동 소수점 연산에 대한 비정규 입력 인수를 0으로 처리하고, FTZ는 비정규 부동 소수점이 생성되는 연산에 대해 0을 반환한다. clang 및 gcc는 플랫폼 및 최적화 수준에 따라 기본 상태가 다르다.

SSE를 지원하는 대상에서 DAZ 및 FTZ 플래그를 활성화하는 방법은 널리 지원되지 않지만, C 라이브러리를 사용하거나 어셈블리 코드를 사용하여 SSE 레지스터를 직접 조작하는 방법이 있다.

  • C 라이브러리 함수(`fesetenv`)를 사용하는 방법 (최소한 2006년부터 Mac OS X에서 작동):

```c

#include

#pragma STDC FENV_ACCESS ON

// 다른 CSR 설정을 손상시키면서 DAZ 및 FTZ를 설정합니다.

fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);

// fesetenv(FE_DFL_ENV) // 둘 다 비활성화하고 다른 CSR 설정을 손상시킵니다.

```

  • x86-SSE 플랫폼에서 C 라이브러리가 이 플래그를 아직 구현하지 않은 경우:

```c

#include

_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` 매크로 사용:

```c

// DAZ를 활성화하려면

#include

_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);

// FTZ를 활성화하려면

#include

_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);

```

대부분의 컴파일러는 위 매크로를 기본적으로 제공하며, 그렇지 않은 경우 다음 코드를 사용할 수 있다.

```c

#define _MM_DENORMALS_ZERO_MASK 0x0040

#define _MM_DENORMALS_ZERO_ON 0x0040

#define _MM_DENORMALS_ZERO_OFF 0x0000

#define _MM_SET_DENORMALS_ZERO_MODE(mode) _mm_setcsr((_mm_getcsr() & ~_MM_DENORMALS_ZERO_MASK) | (mode))

#define _MM_GET_DENORMALS_ZERO_MODE() (_mm_getcsr() & _MM_DENORMALS_ZERO_MASK)

```

인텔사의 주류 마이크로프로세서의 경우, IA-64SSE에서 연산 결과로 gradual underflow를 수행하지 않고 0으로 반올림하는 FTZ(Flush-to-Zero)라는 하드웨어 기능이 있다. SSE 이후의 확장에는 연산의 피연산자에서 비정규 값을 0으로 반올림하는 DAZ(Denormals-Are-Zero)라는 하드웨어 기능도 있다. 둘 다 CSR(control/status register)의 마스크로 지정할 수 있다.

5. 2. ARM

AArch32 NEON(SIMD) FPU는 항상 플러시-투-제로 (flush-to-zero) 모드를 사용하며[15], 이는 FTZ + DAZ영어와 동일하다. 스칼라 FPU와 AArch64 SIMD의 경우, 플러시-투-제로 동작은 선택 사항이며, 제어 레지스터의 FZ영어 비트 (Arm32에서는 FPSCR, AArch64에서는 FPCR)에 의해 제어된다.[15]

이를 수행하는 한 가지 방법은 다음과 같다.

```c

#if defined(__arm64__) || defined(__aarch64__)

uint64_t fpcr;

asm( "mrs %0, fpcr" : "=r"( fpcr )); //FPCR 레지스터 로드

asm( "msr fpcr, %0" :: "r"( fpcr | (1 << 24) )); //24번째 비트(FTZ)를 1로 설정

#endif

```

일부 ARM 프로세서는 서브노멀(subnormals)에 대한 하드웨어 처리를 갖추고 있다.[18][19] 시스템에 따라 비정규 값을 정규 값과 동일한 형태로 하드웨어에서 처리하는 경우가 있다. 구현에 따라 시스템 소프트웨어에 비정규 값 처리를 맡기고, 하드웨어에서는 정규 값과 0만 처리하는 경우도 있다. 비정규 값을 소프트웨어로 처리하면 성능이 크게 저하된다. 그러나 비정규 값을 완전히 하드웨어에서 처리하더라도, 현대의 많은 프로세서에서는 역시 계산 성능이 대폭 저하된다. 아키텍처에 따라 정규 값의 100배나 시간이 걸리는 경우도 있다.[18][19]

정밀도를 유지하고 성능 저하도 방지할 목적으로, 비정규 값을 발생시키지 않도록 코드를 작성하는 애플리케이션도 있다. 예를 들어 음성 처리 애플리케이션에서는 비정규 값이 신호가 인간의 귀에 들리지 않을 정도로 작을 때 나타난다. 따라서 비정규 값이 된 신호 부분은 0으로 잘라내는 대책을 취하는 것이 일반적이다.[20]

참조

[1] 웹사이트 IEEE 754R meeting minutes, 2002 https://web.archive.[...] 2013-12-29
[2] 웹사이트 An Interview with the Old Man of Floating-Point http://www.eecs.berk[...] University of California, Berkeley
[3] 웹사이트 Denormalized numbers http://osr507doc.xin[...] Caldera International 2023-10-11
[4] 논문 FPU Implementations with Denormalized Numbers http://www.acsel-lab[...] 2005-07
[5] 웹사이트 Quantifying the Interference Caused by Subnormal Floating-Point Values http://charm.cs.uiuc[...] 2010-11-30
[6] 웹사이트 Instruction tables: Lists of instruction latencies, throughputs and microoperation breakdowns for Intel, AMD and VIA CPUs http://www.agner.org[...] 2011-01-25
[7] 웹사이트 On Subnormal Floating Point and Abnormal Timing https://cseweb.ucsd.[...] 2015-10-05
[8] 웹사이트 Pentium 4 denormalization: CPU spikes in audio applications https://web.archive.[...] 2015-04-29
[9] 웹사이트 Denormal numbers in floating point signal processing applications http://ldesoras.free[...] 2005-04-19
[10] 웹사이트 x87 and SSE Floating Point Assists in IA-32: Flush-To-Zero (FTZ) and Denormals-Are-Zero (DAZ) http://software.inte[...] 2010-09-03
[11] 웹사이트 Intel® MPI Library – Documentation http://software.inte[...] Intel
[12] 웹사이트 Re: Macbook pro performance issue https://web.archive.[...] Apple Inc.
[13] 웹사이트 Re: Changing floating point state (Was: double vs float performance) https://web.archive.[...] Apple Inc. 2013-01-24
[14] 웹사이트 C++ Compiler for Linux* Systems User's Guide https://software.int[...] Intel
[15] 웹사이트 Aarch64 Registers https://developer.ar[...] Arm
[16] 문서 絶対精度は、最小の正規化数と同じままである。
[17] Youtube An Interview with the Old Man of Floating-Point http://www.eecs.berk[...]
[18] 웹사이트 Quantifying the Interference Caused by Subnormal Floating-Point Values http://charm.cs.uiuc[...] 2006-09-12
[19] 웹사이트 Instruction tables: Lists of instruction latencies, throughputs and microoperation breakdowns for Intel, AMD and VIA CPUs http://www.agner.org[...]
[20] 웹사이트 Pentium 4 denormalization: CPU spikes in audio applications http://phonophunk.co[...] 2002-04-16
[21] 문서 資料にはSSE2とあるが、組込み関数を宣言するヘッダではSSE3扱いとなっている
[22] 웹사이트 x87 and SSE Floating Point Assists in IA-32: Flush-To-Zero (FTZ) and Denormals-Are-Zero (DAZ) http://software.inte[...] 2008-10-16



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com