계산기 엡실론
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
계산기 엡실론은 부동소수점 연산에서 발생하는 반올림 오차의 상한을 나타내는 값으로, IEEE 754 표준에서 정의된다. 이 값은 밑수와 정밀도에 따라 결정되며, 프로그래밍 언어별로 다양한 방식으로 접근할 수 있다. C 언어에서는 `
더 읽어볼만한 페이지
| 계산기 엡실론 | |
|---|---|
| 개요 | |
| 명칭 | 계산기 엡실론 |
| 영어 명칭 | 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. 표준적인 하드웨어 부동소수점 연산의 값
표준 부동 소수점 형식에 따른 계산기 엡실론 값은 다음과 같다.
계산기 엡실론은 부동소수점 연산에서 반올림 오차의 상한을 나타내는 값이다. LAPACK, Scilab 등에서는 를, ISO C 표준, C, C++, 파이썬 등에서는 를 계산기 엡실론으로 정의한다.
컴퓨터에서 다루는 부동 소수점 수는 지수부와 가수 부분으로 나뉘는데, 단순히 작은 수를 표현하는 것은 지수부를 작게 하면 가능하다. 그러나 "1보다 큰 최소의 수"와 같이 미세한 차이를 표현할 때는 가수 부분을 사용하며, 이 가수 부분의 한계가 계산기 엡실론이다.
진법으로 가수 자릿수를 가지는 부동 소수점 수에서, 계산기 엡실론은 이다.[21] 예를 들어, IEEE 754 binary32(단정밀도)는 이고 이므로 1.192E-7이다.
2. 1. IEEE 754 표준
IEEE 754영어 표준은 부동소수점 형식과 관련하여 계산기 엡실론 값을 정의한다. 다음 표는 표준 부동 소수점 형식에 대한 계산기 엡실론 값을 보여준다.
진법으로 가수 자릿수를 가지는 부동 소수점 수에서, 계산기 엡실론은 로 주어진다.[21] 예를 들어, IEEE 754의 binary32(단정밀도)는 이고, 이므로, 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 | 반정밀도 | 2 | 11 (1비트가 암시적) | 2−11 ≈ 4.88e-04 | 2−10 ≈ 9.77e-04 |
| binary32 | 단정밀도 | 2 | 24 (1비트가 암시적) | 2−24 ≈ 5.96e-08 | 2−23 ≈ 1.19e-07 |
| binary64 | 배정밀도 | 2 | 53 (1비트가 암시적) | 2−53 ≈ 1.11e-16 | 2−52 ≈ 2.22e-16 |
| align="center" | | 확장 정밀도, long double | 2 | 64 | 2−64 ≈ 5.42e-20 | 2−63 ≈ 1.08e-19 |
| binary128 | 사중(ruple) 정밀도 | 2 | 113 (1비트가 암시적) | 2−113 ≈ 9.63e-35 | 2−112 ≈ 1.93e-34 |
| decimal32 | 단정밀도 십진수 | 10 | 7 | 5 × 10−7 | 10−6 |
| decimal64 | 배정밀도 십진수 | 10 | 16 | 5 × 10−16 | 10−15 |
| decimal128 | 사중(ruple) 정밀도 십진수 | 10 | 34 | 5 × 10−34 | 10−33 |
IEEE 표준에서는 "머신 엡실론"과 "단위 반올림"이라는 용어를 정의하지 않아, 이러한 용어에 대한 서로 다른 정의가 사용되어 혼란을 야기할 수 있다.
3. 머신 엡실론의 정의
두 용어는 2의 배수만큼 차이가 난다. "주류 정의"는 대부분의 현대 프로그래밍 언어에서 사용되며, "머신 엡실론은 1과 다음으로 큰 부동 소수점 수의 차이"로 정의된다. "공식 정의"는 "주류 정의"의 절반 크기의 엡실론을 산출하는 것으로 간주할 수 있지만, 사용된 반올림 형식에 따라 정의가 다르다.
컴퓨터에서 다루는 부동 소수점 수는 지수부와 가수 부분으로 나뉘며, 작은 수를 나타내는 것은 지수부를 작게 하면 표현할 수 있다. 반면, "1보다 큰 최소의 수"와 같은 경우에는 가수 부분을 사용하여 미세한 차이를 표현하며, 그 한계가 계산기 엡실론이다.
진법으로 가수 자릿수인 부동 소수점 수의 경우, 계산기 엡실론은 가 된다.[21] 예를 들어, IEEE 754의 binary32(단정밀도)에서는 , 이므로, 이다. 마찬가지로 IEEE 754의 binary64(배정밀도)에서는 이고, binary128(4배정밀도)에서는 이다. 일부 환경에서는 확장 배정밀도 부동 소수점 수가 지원되며, 80비트 구현의 경우 이다.
일부에서는 "이 되는 최소의 "라는 정의를 사용하기도 하는데,[23] 이 정의는 부동 소수점 연산의 반올림 처리에 따라 값이 달라지므로,[21] 엄밀하게는 앞선 정의와 같지 않다.
3. 1. 산술 모델
IEEE 산술 표준에 따르면, 모든 부동소수점 연산은 무한 정밀도로 계산된 후 부동소수점 숫자로 반올림되는 것처럼 수행된다.[1] x와 y가 부동소수점 숫자이고, 가 덧셈이나 곱셈 같은 산술 연산이며, 가 무한 정밀도 연산이라고 가정하면, 컴퓨터는 다음 식과 같이 계산한다.
:
머신 엡실론의 정의에 따라 반올림의 상대 오차는 최대 머신 엡실론 크기를 가지므로 다음과 같이 표현할 수 있다.
:
여기서 z의 절댓값은 최대 (머신 엡실론) 또는 '''u'''(단위 반올림)이다.[1] 이 모델은 가우스 소거법 등의 오류 분석에 사용될 수 있다.[1]
3. 2. 머신 엡실론 결정 방법
표준 라이브러리에서 미리 계산된 값을 제공하지 않는 경우, 머신 엡실론을 결정하는 가장 좋은 방법은 적절한 거듭제곱 공식을 사용하는 것이다. 머신 엡실론 계산은 종종 교과서 연습 문제로 나온다. 다음 예제는 단위 반올림이 아닌 1에서의 부동 소수점 숫자 간격이라는 의미에서 ''구간 머신 엡실론''을 계산한다.
결과는 프로그래밍 언어, 컴파일러 및 런타임 라이브러리에서 지원하는 `float`, `double`, `long double` 또는 이와 유사한 특정 부동 소수점 형식에 따라 달라진다.
프로세서에서 지원하는 일부 형식은 선택한 컴파일러 및 운영 체제에서 지원되지 않을 수 있다. 다른 형식은 일부 언어 및 라이브러리에서 사용할 수 있는 임의 정밀도 산술을 포함하여 런타임 라이브러리에서 에뮬레이션될 수 있다.
엄밀한 의미에서 '머신 엡실론'이라는 용어는 특정 운영 체제에 대한 특정 컴파일러에서 지원하는 정확도가 아닌, 프로세서(또는 보조 프로세서)에서 직접 지원하는 정확도를 의미한다.
IEEE 754 부동 소수점 형식은 동일한 너비의 2의 보수 정수로 재해석될 때 양의 값에서는 단조롭게 증가하고 음의 값에서는 단조롭게 감소하는 속성을 갖는다(32비트 부동 소수점의 이진 표현 참조). 또한 이고 의 속성을 갖는다(여기서 는 위에 언급된 의 정수 재해석이다). 타입 퍼닝을 허용하고 항상 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. 절대 상대 오차와의 관계
만약 가 숫자 의 기계적 표현이라면, 그 표현의 절대 상대 오차는 [20]이다. 다음 증명은 양수와 잘라내기 방식을 사용하는 기계 표현으로 제한된다.
표현하려는 양수 가 있다면, 보다 작은 기계 숫자 와 보다 큰 기계 숫자 사이에 있게 된다.
만약 이고, 여기서 은 가수의 크기에 사용되는 비트 수라면, 다음이 성립한다.
의 표현이 또는 중 하나이므로,
이 증명은 양수와 잘라내기 방식에 제한되지만, 음수 및 가장 가까운 값으로 반올림 기계 표현과 관련된 부등식을 증명하는 데 동일한 방법을 사용할 수 있다.
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
[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