맨위로가기

계산기 엡실론

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

1. 개요

계산기 엡실론은 부동소수점 연산에서 발생하는 반올림 오차의 상한을 나타내는 값으로, IEEE 754 표준에서 정의된다. 이 값은 밑수와 정밀도에 따라 결정되며, 프로그래밍 언어별로 다양한 방식으로 접근할 수 있다. C 언어에서는 ``에 매크로 상수로 정의되어 있으며, C++에서는 `std::numeric_limits::epsilon()` 함수를 통해, 파이썬에서는 `sys.float_info.epsilon`으로, 자바스크립트에서는 `Number.EPSILON`으로, 줄리아에서는 `eps()` 함수를 통해, Swift에서는 `FloatingPoint` 프로토콜의 `ulpOfOne` 타입 프로퍼티를 통해 얻을 수 있다. 머신 엡실론은 수치 해석에서 반올림 오차의 영향을 연구하는 데 사용되며, 부동 소수점 수의 절대 상대 오차를 제한하는 데 활용된다. .NET 환경에서는 `System.Double.Epsilon` 등이 머신 엡실론과 다른 개념을 나타내므로 주의해야 한다.

더 읽어볼만한 페이지

  • 컴퓨터 산술 - IEEE 754
    IEEE 754는 부동소수점 숫자를 표현하고 처리하기 위한 국제 표준으로, 다양한 형식과 연산, 반올림 규칙, 예외 처리 등을 정의한다.
  • 컴퓨터 산술 - 1의 보수
    1의 보수는 이진수에서 양수는 일반적인 이진수로, 음수는 양수의 각 비트를 반전시켜 표현하며, 덧셈 시 자리올림수가 발생하면 결과값에 더해야 하고, 0을 중복 표현하는 단점으로 현대에는 2의 보수가 주로 사용된다.
계산기 엡실론
개요
명칭계산기 엡실론
영어 명칭Machine epsilon
일본어 명칭計算機イプシロン (Keisanki ipushiron)
정의부동소수점 연산에서 반올림 오차의 상한
다른 이름머신 엡실론 (meosin epseollon)
단위 라운드오프 (danwi raundeuopeu)
ulp (unit in the last place)
기호ε (epseollon)
세부 사항
설명부동소수점 시스템에서 1보다 큰 가장 작은 수와 1의 차이
활용수치 해석 알고리즘의 정확도 분석, 수치적 안정성 평가
시스템 및 데이터 유형에 따라 다름
예시 (IEEE 754 단정밀도)2⁻²³ ≈ 1.19209 × 10⁻⁷
예시 (IEEE 754 배정밀도)2⁻⁵² ≈ 2.22045 × 10⁻¹⁶
관련 개념
관련 용어부동소수점
반올림 오차
수치 해석
IEEE 754
관련 기법오차 분석, 수치 안정성 분석
참고 문헌
참고 문헌C언어에 의한 최신 알고리즘 사전, 기술평론사, 오쿠무라 하루히코, 1991, p.33, ISBN 4-87408-414-1

2. 표준적인 하드웨어 부동소수점 연산의 값

표준 부동 소수점 형식에 따른 계산기 엡실론 값은 다음과 같다.

IEEE 754 - 2008통상명C++ 데이터 타입b정밀도 p계산기 엡실론[21] b^{-(p-1)}/2계산기 엡실론[21] b^{-(p-1)}
binary16반정밀도short211 (1비트가 암시적)4.88E-49.77E-4
binary32단정밀도float224 (1비트가 암시적)5.96E-81.19E-7
binary64배정밀도double253 (1비트가 암시적)1.11E-162.22E-16
binary80확장배정밀도_float80[37]2645.42E-201.08E-19
binary128사배정밀도_float128[37]2113 (1비트가 암시적)9.63E-351.93E-34
decimal32십진 단정밀도_Decimal32[38]1075E-71E-6
decimal64십진 배정밀도_Decimal64[38]10165E-161E-15
decimal128십진 사배정밀도_Decimal128[38]10345E-341E-33



계산기 엡실론은 부동소수점 연산에서 반올림 오차의 상한을 나타내는 값이다. LAPACK, Scilab 등에서는 b^{-(p-1)}/2를, ISO C 표준, C, C++, 파이썬 등에서는 b^{-(p-1)}를 계산기 엡실론으로 정의한다.

컴퓨터에서 다루는 부동 소수점 수는 지수부와 가수 부분으로 나뉘는데, 단순히 작은 수를 표현하는 것은 지수부를 작게 하면 가능하다. 그러나 "1보다 큰 최소의 수"와 같이 미세한 차이를 표현할 때는 가수 부분을 사용하며, 이 가수 부분의 한계가 계산기 엡실론이다.

b진법으로 가수 p 자릿수를 가지는 부동 소수점 수에서, 계산기 엡실론은 b^{1-p}이다.[21] 예를 들어, IEEE 754 binary32(단정밀도)는 b = 2이고 p = 24이므로 \epsilon=2^{1-24}=1.192E-7이다.

2. 1. IEEE 754 표준

IEEE 754영어 표준은 부동소수점 형식과 관련하여 계산기 엡실론 값을 정의한다. 다음 표는 표준 부동 소수점 형식에 대한 계산기 엡실론 값을 보여준다.

IEEE 754-2008일반적인 이름C++ 데이터 유형밑 (b)정밀도 (p)반올림 계산기 엡실론[21]간격 계산기 엡실론
binary16반정밀도211 (1비트가 암시적)2−11 ≈ 4.88e-42−10 ≈ 9.77e-4
binary32단정밀도224 (1비트가 암시적)2−24 ≈ 5.96e-82−23 ≈ 1.19e-7
binary64배정밀도253 (1비트가 암시적)2−53 ≈ 1.11e-162−52 ≈ 2.22e-16
확장 정밀도, long double[1]2642−64 ≈ 5.42e-202−63 ≈ 1.08e-19
binary128사중(ruple) 정밀도[1]2113 (1비트가 암시적)2−113 ≈ 9.63e-352−112 ≈ 1.93e-34
decimal32단정밀도 십진수[2]1075 × 10−710−6
decimal64배정밀도 십진수[2]10165 × 10−1610−15
decimal128사중(ruple) 정밀도 십진수[2]10345 × 10−3410−33



b진법으로 가수 p 자릿수를 가지는 부동 소수점 수에서, 계산기 엡실론은 b^{1-p}로 주어진다.[21] 예를 들어, IEEE 754의 binary32(단정밀도)는 b = 2이고, p = 24이므로, \epsilon=2^{1-24}=1.192e-7이다.

2. 2. 프로그래밍 언어별 머신 엡실론

C, C++, Python, JavaScript, Julia, Swift 등 다양한 프로그래밍 언어에서 머신 엡실론을 얻는 방법은 다음과 같다.

  • C 언어: `<float.h>`에 `'''FLT_EPSILON'''`, `'''DBL_EPSILON'''`, `'''LDBL_EPSILON'''`이라는 매크로 상수가 정의되어 있으며, 각각 `float`형, `double`형, `long double`형의 계산기 엡실론 값이 된다[21]
  • C++: 템플릿을 활용한 `std::numeric_limits<T>::epsilon()` 함수가 정의되어 있다.[30] 반환되는 값은 C 언어의 상수와 동일하다.
  • 파이썬: C의 `DBL_EPSILON`에 준하는 값이 `sys.float_info.epsilon`으로 정의되어 있다.[31]
  • 자바스크립트: `Number.EPSILON`이 정의되어 있다.[32]
  • 줄리아: 계산기 엡실론을 얻는 함수 `eps(Float32)`와 같이 사용한다.
  • Swift: `FloatingPoint` 프로토콜(추상형)에 타입 프로퍼티 `ulpOfOne`이 정의되어 있다.[29] C의 `FLT_EPSILON`, `DBL_EPSILON`, `LDBL_EPSILON`에 해당하는 구현은 각각 `Float.ulpOfOne`, `Double.ulpOfOne`, `Float80.ulpOfOne`이다.[33][34][35] 단, `Float80`은 인텔(x86) 프로세서 환경에서만 이용 가능하며, Apple 실리콘 (ARM 아키텍처)에서는 사용할 수 없다.[36]


머신 엡실론을 계산하는 예제 코드는 다음과 같다.

  • C 예제:


```c

typedef union {

long long i64;

double d64;

} dbl_64;

double machine_eps (double value)

{

dbl_64 s;

s.d64 = value;

s.i64++;

return s.d64 - value;

}

```

  • Python 예제:


```python

def machineEpsilon(func=float):

machine_epsilon = func(1)

while func(1) + machine_epsilon != func(1):

machine_epsilon_last = machine_epsilon

machine_epsilon = func(machine_epsilon) / func(2)

return machine_epsilon_last

```

위 Python 예제 코드를 실행하면 64비트 double형에서 2-52에 해당하는 2.220446e-16 값을 얻을 수 있다.

표준 부동 소수점 형식에 대한 기계 엡실론 값은 다음 표와 같다.

IEEE 754 - 2008일반적인 이름C++ 데이터 유형정밀도반올림 기계 엡실론간격 기계 엡실론
binary16반정밀도211 (1비트가 암시적)2−11 ≈ 4.88e-042−10 ≈ 9.77e-04
binary32단정밀도224 (1비트가 암시적)2−24 ≈ 5.96e-082−23 ≈ 1.19e-07
binary64배정밀도253 (1비트가 암시적)2−53 ≈ 1.11e-162−52 ≈ 2.22e-16
align="center" |확장 정밀도, long double2642−64 ≈ 5.42e-202−63 ≈ 1.08e-19
binary128사중(ruple) 정밀도2113 (1비트가 암시적)2−113 ≈ 9.63e-352−112 ≈ 1.93e-34
decimal32단정밀도 십진수1075 × 10−710−6
decimal64배정밀도 십진수10165 × 10−1610−15
decimal128사중(ruple) 정밀도 십진수10345 × 10−3410−33


3. 머신 엡실론의 정의

IEEE 표준에서는 "머신 엡실론"과 "단위 반올림"이라는 용어를 정의하지 않아, 이러한 용어에 대한 서로 다른 정의가 사용되어 혼란을 야기할 수 있다.

두 용어는 2의 배수만큼 차이가 난다. "주류 정의"는 대부분의 현대 프로그래밍 언어에서 사용되며, "머신 엡실론은 1과 다음으로 큰 부동 소수점 수의 차이"로 정의된다. "공식 정의"는 "주류 정의"의 절반 크기의 엡실론을 산출하는 것으로 간주할 수 있지만, 사용된 반올림 형식에 따라 정의가 다르다.

컴퓨터에서 다루는 부동 소수점 수는 지수부와 가수 부분으로 나뉘며, 작은 수를 나타내는 것은 지수부를 작게 하면 표현할 수 있다. 반면, "1보다 큰 최소의 수"와 같은 경우에는 가수 부분을 사용하여 미세한 차이를 표현하며, 그 한계가 계산기 엡실론이다.

b진법으로 가수 p 자릿수인 부동 소수점 수의 경우, 계산기 엡실론은 b^{1-p}가 된다.[21] 예를 들어, IEEE 754의 binary32(단정밀도)에서는 b = 2, p = 24이므로, \epsilon=2^{1-24}=1.192\times10^{-7}이다. 마찬가지로 IEEE 754의 binary64(배정밀도)에서는 \epsilon=2^{1-53}=2.220\times10^{-16}이고, binary128(4배정밀도)에서는 \epsilon=2^{1-113}=1.926\times10^{-34}이다. 일부 환경에서는 확장 배정밀도 부동 소수점 수가 지원되며, 80비트 구현의 경우 \epsilon=2^{1-64}=1.084\times10^{-19}이다.

일부에서는 "1+x \neq 1이 되는 최소의 x"라는 정의를 사용하기도 하는데,[23] 이 정의는 부동 소수점 연산의 반올림 처리에 따라 값이 달라지므로,[21] 엄밀하게는 앞선 정의와 같지 않다.

3. 1. 산술 모델

IEEE 산술 표준에 따르면, 모든 부동소수점 연산은 무한 정밀도로 계산된 후 부동소수점 숫자로 반올림되는 것처럼 수행된다.[1] x와 y가 부동소수점 숫자이고, \bullet가 덧셈이나 곱셈 같은 산술 연산이며, \circ가 무한 정밀도 연산이라고 가정하면, 컴퓨터는 다음 식과 같이 계산한다.

:x \bullet y = \mbox {round} (x \circ y)

머신 엡실론의 정의에 따라 반올림의 상대 오차는 최대 머신 엡실론 크기를 가지므로 다음과 같이 표현할 수 있다.

:x \bullet y = (x \circ y)(1 + z)

여기서 z의 절댓값은 최대 \varepsilon (머신 엡실론) 또는 '''u'''(단위 반올림)이다.[1] 이 모델은 가우스 소거법 등의 오류 분석에 사용될 수 있다.[1]

3. 2. 머신 엡실론 결정 방법

표준 라이브러리에서 미리 계산된 값을 제공하지 않는 경우, 머신 엡실론을 결정하는 가장 좋은 방법은 적절한 거듭제곱 공식을 사용하는 것이다. 머신 엡실론 계산은 종종 교과서 연습 문제로 나온다. 다음 예제는 단위 반올림이 아닌 1에서의 부동 소수점 숫자 간격이라는 의미에서 ''구간 머신 엡실론''을 계산한다.

결과는 프로그래밍 언어, 컴파일러 및 런타임 라이브러리에서 지원하는 `float`, `double`, `long double` 또는 이와 유사한 특정 부동 소수점 형식에 따라 달라진다.

프로세서에서 지원하는 일부 형식은 선택한 컴파일러 및 운영 체제에서 지원되지 않을 수 있다. 다른 형식은 일부 언어 및 라이브러리에서 사용할 수 있는 임의 정밀도 산술을 포함하여 런타임 라이브러리에서 에뮬레이션될 수 있다.

엄밀한 의미에서 '머신 엡실론'이라는 용어는 특정 운영 체제에 대한 특정 컴파일러에서 지원하는 1 + \varepsilon 정확도가 아닌, 프로세서(또는 보조 프로세서)에서 직접 지원하는 1 + \varepsilon 정확도를 의미한다.

IEEE 754 부동 소수점 형식은 동일한 너비의 2의 보수 정수로 재해석될 때 양의 값에서는 단조롭게 증가하고 음의 값에서는 단조롭게 감소하는 속성을 갖는다(32비트 부동 소수점의 이진 표현 참조). 또한 0 < |f(x)| < \infty이고 |f(x+1) - f(x)| \ge |f(x) - f(x-1)|의 속성을 갖는다(여기서 f(x)는 위에 언급된 x의 정수 재해석이다). 타입 퍼닝을 허용하고 항상 IEEE 754–1985를 사용하는 언어에서는 이를 활용하여 머신 엡실론을 상수 시간 내에 계산할 수 있다. C언어의 예시는 다음과 같다.

```c

typedef union {

long long i64;

double d64;

} dbl_64;

double machine_eps (double value)

{

dbl_64 s;

s.d64 = value;

s.i64++;

return s.d64 - value;

}

```

이렇게 하면 값과 동일한 부호의 결과가 제공된다. 항상 양의 결과를 원하는 경우 machine_eps의 반환 문을 다음으로 바꿀 수 있다.

```c

return (s.i64 < 0 ? value - s.d64 : s.d64 - value);

```

Python 예시:

```python

def machineEpsilon(func=float):

machine_epsilon = func(1)

while func(1) + machine_epsilon != func(1):

machine_epsilon_last = machine_epsilon

machine_epsilon = func(machine_epsilon) / func(2)

return machine_epsilon_last

```

64비트 double은 예상대로 2.220446e-16, 즉 2|2영어−52를 제공한다.

4. 절대 상대 오차와의 관계

만약 y가 숫자 x의 기계적 표현이라면, 그 표현의 절대 상대 오차는 \left| \dfrac{x - y}{x} \right| \leq \varepsilon_\text{mach}.[20]이다. 다음 증명은 양수와 잘라내기 방식을 사용하는 기계 표현으로 제한된다.

표현하려는 양수 x 가 있다면, x 보다 작은 기계 숫자 x_{b} x 보다 큰 기계 숫자 x_{u} 사이에 있게 된다.

만약 x_{b} = \left( 1.b_{1}b_{2} \ldots b_{m} \right)_{2} \times 2^{k} 이고, 여기서 m 은 가수의 크기에 사용되는 비트 수라면, 다음이 성립한다.



\begin{align}

x_{u}

&= \left[ (1.b_{1}b_{2}\ldots b_{m})_{2} + (0.00 \ldots 1)_{2} \right] \times 2^{k}\\

&= \left[ (1.b_{1}b_{2} \ldots b_{m})_{2} + 2^{- m} \right] \times 2^{k}\\

&= (1.b_{1}b_{2} \ldots b_{m})_{2} \times 2^{k} + 2^{- m} \times 2^{k}\\

&= (1.b_{1}b_{2} \ldots b_{m})_{2} \times 2^{k} + 2^{- m + k}.

\end{align}



x 의 표현이 x_b 또는 x_u 중 하나이므로,



\begin{align}

\left| x - y \right|

&\leq \left| x_{b} - x_{u} \right|\\

&= 2^{- m + k}

\end{align}





\begin{align}

\left| \frac{x - y}{x} \right|

&\leq \frac{2^{- m + k}}{x}\\

&\leq \frac{2^{- m + k}}{x_{b}}\\

&= \frac{2^{- m + k}}{(1 \cdot b_{1}b_{2} \ldots b_{m})_{2}2^{k}}\\

&= \frac{2^{- m}}{(1 \cdot b_{1}b_{2} \ldots b_{m})_{2}}\\

&\leq 2^{- m}

= \varepsilon_\text{mach}.

\end{align}



이 증명은 양수와 잘라내기 방식에 제한되지만, 음수 및 가장 가까운 값으로 반올림 기계 표현과 관련된 부등식을 증명하는 데 동일한 방법을 사용할 수 있다.

5. .NET 환경에서의 주의점

마이크로소프트의 .NET 프레임워크 및 .NET의 기본 클래스 라이브러리에는 `System.Double.Epsilon`이라는 상수 필드가 정의되어 있지만, 이는 부동 소수점 방식으로 표현 가능한 최소의 양의 비정규화 수이며, '''머신 엡실론이 아니다'''.[25] `System.Single.Epsilon`도 마찬가지이다.[26] 이들은 C11/C++17의 `DBL_TRUE_MIN`나 `FLT_TRUE_MIN`에 해당한다.[27][28]

역사적으로 "epsilon"은 서로 다른 언어에서 다양한 개념을 가리키는 용어로 사용되었으며, 혼란이나 버그를 유발하기 쉽다.[29]

참조

[1] 웹사이트 Floating Types - Using the GNU Compiler Collection (GCC) https://gcc.gnu.org/[...]
[2] 웹사이트 Decimal Float - Using the GNU Compiler Collection (GCC) https://gcc.gnu.org/[...]
[3] 웹사이트 Basic Issues in Floating Point Arithmetic and Error Analysis http://www.cs.berkel[...] 1999-10-21
[4] 웹사이트 LAPACK Users' Guide Third Edition http://www.netlib.or[...] 1999-08-22
[5] 웹사이트 David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic, ACM Computing Surveys, Vol 23, No 1, March 1991 https://www.ualberta[...] 1991-03
[6] 웹사이트 Scilab documentation - number_properties - determine floating-point parameters http://help.scilab.o[...]
[7] 웹사이트 Basic Issues in Floating Point Arithmetic and Error Analysis http://www.cs.berkel[...] University of California, Berkeley 1999-10-21
[8] 서적 The New C Standard - An Economic and Cultural Commentary http://www.coding-gu[...]
[9] 웹사이트 float.h reference at cplusplus.com http://www.cplusplus[...]
[10] 웹사이트 std::numeric_limits reference at cplusplus.com http://www.cplusplus[...]
[11] 웹사이트 Python documentation - System-specific parameters and functions https://docs.python.[...]
[12] 간행물 Extended Pascal ISO 10206:1990
[13] 웹사이트 Mathematica documentation: $MachineEpsilon http://reference.wol[...]
[14] 웹사이트 Matlab documentation - eps - Floating-point relative accuracy http://www.mathworks[...]
[15] 웹사이트 Octave documentation - eps function http://octave.source[...]
[16] 서적 Accuracy and Stability of Numerical Algorithms (2 ed) SIAM
[17] 서적 Numerical Mathematics http://www.techmat.v[...] Springer 2013-04-11
[18] 서적 Numerical Recipes
[19] 서적 Numerik-Algorithmen
[20] 웹사이트 Machine Epsilon Value for IEEE Double Precision Standard Alternative Proof Using Relative Error https://math.stackex[...] 2020-10-12
[21] 서적 C言語による最新アルゴリズム事典 技術評論社
[22] 웹사이트 epsilonの意味・使い方・読み方|英辞郎 on the WEB https://eow.alc.co.j[...]
[23] 웹사이트 Data Type Constants | Microsoft Docs https://docs.microso[...]
[24] 웹사이트 Double.Epsilon Field (System) | Microsoft Learn https://learn.micros[...]
[25] 웹사이트 System.Double.Epsilon property - .NET https://learn.micros[...] 2024-06-16
[26] 웹사이트 Single.Epsilon Field (System) | Microsoft Learn https://learn.micros[...]
[27] 웹사이트 Numeric limits - cppreference.com https://en.cpprefere[...]
[28] 웹사이트 C numeric limits interface - cppreference.com https://en.cpprefere[...]
[29] 웹사이트 Protocol FloatingPoint, Type Property ulpOfOne | Apple Developer Documentation https://developer.ap[...]
[30] 웹사이트 std::numeric_limits::epsilon - cppreference.com https://ja.cpprefere[...]
[31] 웹사이트 sys — System-specific parameters and functions — Python 3.10 documentation https://docs.python.[...]
[32] 웹사이트 Number.EPSILON - JavaScript | MDN https://developer.mo[...]
[33] 웹사이트 Structure Float, Type Property ulpOfOne | Apple Developer Documentation https://developer.ap[...]
[34] 웹사이트 Structure Double, Type Property ulpOfOne | Apple Developer Documentation https://developer.ap[...]
[35] 웹사이트 Structure Float80, Type Property ulpOfOne | Apple Developer Documentation https://developer.ap[...]
[36] 문서 Float80 | Apple Developer Documentation https://developer.ap[...]
[37] 문서 Floating Types - Using the GNU Compiler Collection (GCC) http://gcc.gnu.org/o[...]
[38] 문서 Decimal Float - Using the GNU Compiler Collection (GCC) http://gcc.gnu.org/o[...]



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

문의하기 : help@durumis.com