기계 엡실론

Machine epsilon

기계 엡실론 또는 기계 정밀도부동 소수점 산술에서 반올림으로 인한 상대 근사 오차 상한을 제공한다. 값은 수치해석 분야에서 컴퓨터 산수를 특징으로 하고, 계산 과학 과목에서 확장하여 그 특성을 나타낸다. 수량은 마체프 또는 단위 반올림이라고도 하며, 각각 그리스어 엡실론 또는 굵은 로마어 u의 기호를 가지고 있다.

표준 하드웨어 부동소수 산술에 대한 값

기계 엡실론의 다음 값은 표준 부유점 형식에 적용된다.

IEEE 754 - 2008 공용명 C++ 데이터 유형 b p 시스템 엡실론[a] - (- )/ } 기계 엡실론[b] -( - ) b
바이너리16 반정밀 해당 없음 2 11(하나의 비트는 암시적임) 2−11 ≈ 4.88e-04 2−10 ≈ 9.77e-04
바이너리32 단정밀도 둥둥 뜨다 2 24(하나의 비트는 암시적임) 2−24 ≈ 5.96e-08 2−23 ≈ 1.19e-07
바이너리64 2배 정밀도 곱절로 하다 2 53(하나의 비트는 암시적임) 2−53 ≈ 1.11e-16 2−52 ≈ 2.22e-16
확장 정밀도, 긴 이중 _1980년[1] 2 64 2−64 ≈ 5.42e-20 2−63 ≈ 1.08e-19
2진법 4중 정밀도 _float128[1] 2 113(하나의 비트는 암시적임) 2−113 ≈ 9.63e-35 2−112 ≈ 1.93e-34
십진법으로32번길 단정밀 소수점 _Decimal32[2] 10 7 5 × 10−7 10−6
십진법으로64번길 이중 정밀 십진법 _Decimal64[2] 10 16 5 × 10−16 10−15
십진법 4진법 정밀 소수점 _Decimal128[2] 10 34 5 × 10−34 10−33
  1. ^ 교수에 따르면. 뎀멜, 라팍, 실랍
  2. ^ 교수에 따르면. Higham; ISO C 표준; Ada, C, C++Python 언어 상수; Mathematica, MATLAB옥타브; 다양한 교과서 - 후자의 정의를 보려면 아래를 참조하십시오.

형식 정의

반올림부동소수번호 체계에서 실수의 표현을 선택하는 절차다. 숫자 시스템과 반올림 절차의 경우 기계 엡실론은 선택한 반올림 절차의 최대 상대적 오류다.

이 정의에서 값을 결정하기 위해서는 약간의 배경이 필요하다. 부동 소수점 번호 시스템은 라고도 하는 라디스를 특징으로 하며, p 유의성의 radix 자리 수(선행 암묵적 비트 포함)가 된다. 동일한 지수 를) 가진 모든 숫자의 간격은 -( p- )) 입니다 간격은 의 완벽한 힘인 숫자에 따라 변화하며규모의 측면의 간격은 규모의 측면의 간격보다 b 크다.

시스템 엡실론은 상대적 오류에 대한 경계이므로 지수 = 을(를) 가진 숫자를 충분히 고려한다 그것은 또한 양수를 고려하는 것으로 충분하다. 일반적인 라운딩에서 가장 가까운 종류의 라운딩의 경우 절대 반올림 오차는 최대 절반의 간격, 즉 -(- 1)/ 이 값은 상대 오차에 대해 가능한 가장 큰 분자다. 상대오차의 분모는 반올림되는 숫자로, 상대오차를 크게 만들려면 가능한 한 작게 해야 한다. 따라서 최악의 상대적 오류는 + 이(가 {\에서 b- - 1 b 사이에 있는 번호에 반올림할 때 한다 + ) a. 최대값은 이(가) 범위의 위쪽 끝에 있을 때 발생한다. 분모에 있는 + 은 분자에 비해 무시해도 되기 때문에 편의상 보류하고, b -(- 1)/ 2{\만 시스템 엡실론(epsilon)으로 취한다. 여기에 나타난 바와 같이 오차는 1 에 반올림하는 숫자에 대해 최악이므로 머신 엡실론은 대략 "단위 값으로 반올림할 때 발생할 수 있는 최대 오차"라는 의미로도 불린다.

따라서 정규화된 부동 소수점 번호, 인접 정규화 숫자 사이의 최대 간격은 2 x이다[3]

산술모형

수치해석은 기계 엡실론을 사용하여 반올림 오차의 효과를 연구한다. 기계 산술의 실제 오류는 직접 연구하기에는 너무 복잡하기 때문에 대신 다음과 같은 간단한 모델을 사용한다. IEEE 산술표준은 모든 부동소수점 연산을 무한정 연산이 가능한 것처럼 행한 다음 그 결과를 부동소수점 수로 반올림한다고 한다. (1) x (가) 부동 소수점 번호, (2) 이(가) 덧셈 또는 곱셈과 같은 부동 소수점 번호에 대한 산술 연산이고 (3) 무한 정밀 연산이라고 가정하자. 표준에 따라 컴퓨터는 다음과 같이 계산한다.

기계 엡실론의 의미에 의해 반올림의 상대적 오차는 대부분 기계 엡실론 크기여서 다음과 같다.

여기서 절대 크기의 은(는) 최대 또는 u이다. 참고문헌에 있는 뎀멜과 하이엄의 책들은 이 모델이 가우스 제거의 오류를 분석하는 데 어떻게 사용되는지 알아보기 위해 참조할 수 있다.

변형 정의

IEEE 표준은 머신 엡실론유닛 반올림이라는 용어를 정의하지 않기 때문에 이 용어의 정의가 서로 달라서 혼동을 일으킬 수 있다.

기계 엡실론에 대해 여기서 주어진 정의는 교수가 사용하는 정의다. 강의 대본, LAPACK 선형 대수 패키지,[4][5] 숫자 연구 논문[6] 및 일부 과학 컴퓨팅 소프트웨어의 제임스 뎀멜.[7] 대부분의 수치 분석가들은 기계 엡실론유닛 반올림이라는 단어를 이 의미와 바꾸어 사용한다.

다음과 같은 다른 정의는 학계 외부에 훨씬 더 널리 퍼져 있다. 기계 엡실론은 1과 다음으로 큰 부동소수 번호 사이의 차이로 정의된다. 이 정의에 따르면 은(는 1에 상대적인 마지막 위치의 단위 값, - (p - 1b[8])}과(는) 같으며, 단위 반올림은/ 2 이 정의의 확산은 부동소수점 유형과[9][10] 다른 프로그래밍 언어의 해당 상수와 관련된 상수에 대한 ISO C 표준의 사용에 뿌리를 두고 있다.[11][12] 그것은 또한 과학적인 컴퓨터 소프트웨어와 [13][14][15]숫자와 컴퓨터 문헌에도 널리 사용된다.[16][17][18][19]

기계 엡실론 결정 방법

표준 라이브러리가 사전 계산된 값을 제공하지 않는 경우(<플로트(float)). 관계가 있다. FLT_EPSILON, DBL_EPSILON 그리고 LDBL_EPSILON 에 관한 C와 <한계>에 관한. std::numeric_limits<T>::epsilon() C++)에서 기계 엡실론을 결정하는 가장 좋은 방법은 위의 표를 참조하고 적절한 전력 공식을 사용하는 것이다. 컴퓨터 기계 엡실론은 종종 교과서적인 연습으로 주어진다. 다음 예제는 단위 반올림(roundoff)의 의미보다는 부동소수점 숫자의 간격을 1로 하여 계산하는 기계 엡실론(epsilon)을 계산한다.

결과는 다음과 같이 사용되는 특정 부동 소수점 형식에 따라 결정된다는 점에 유의하십시오. float, double, long double또는 프로그래밍 언어, 컴파일러 및 실제 플랫폼의 런타임 라이브러리에서 지원하는 것과 유사함.

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

엄밀한 의미에서 machine 엡실론이라는 용어는 프로세서(또는 코프로세서)가 직접 하는 1 {\ 1 정확도를 의미하며, 특정 운영 체제에 대해 특정 컴파일러가 지원하는 일부 1 + 1 정확도를 의미한다.

IEEE 754 부동소수 형식은 같은 폭의 두 개의 보완 정수로 재해석하면 양수치보다 단조롭게 증가하고 음수치보다 단조롭게 감소하는 특성을 갖는다(32비트 부동의 이진 표현 참조). 그들은 또한, f(x+1)− f())≥ f())− fx()− 1){\displaystyle f(x+1)-f())\geq f())-f(x-1)}(어디 f()){\displaystyle f())}은 앞에서 언급한 정수 재해석{\displaystyle은 0<>의 속성은 이름())<>∞{0<, f())<>\infty\displaystyle}을 가지고 있다. x}). 유형 펀닝을 허용하고 IEEE 754-1985를 항상 사용하는 언어에서, 우리는 이것을 이용하여 일정한 시간에 기계 엡실론을 계산할 수 있다. 예를 들어, C:

타이피프 결합하다 {   장기의 장기의 i64;   곱절로 하다 d64; } dbl_64; 곱절로 하다 machine_eps (곱절로 하다 가치를 매기다) {     dbl_64 s;     s.d64 = 가치를 매기다;     s.i64++;     돌아오다 s.d64 - 가치를 매기다; } 

Python의 예:

반항하다 엡실론(펑크=둥둥 뜨다):     기계_엡실론 = 펑크(1)     하는 동안에 펑크(1)+기계_엡실론 != 펑크(1):         machine_엡실론_last = 기계_엡실론         기계_엡실론 = 펑크(기계_엡실론) / 펑크(2)     돌아오다 machine_엡실론_last 

이것은 가치와 같은 부호의 결과를 줄 것이다. 항상 긍정적인 결과를 원하는 경우 machine_eps의 반환문을 다음과 같이 대체할 수 있다.

    돌아오다 (s.i64 < 0 ? 가치를 매기다 - s.d64 : s.d64 - 가치를 매기다); 

64비트 복식은 예상대로−52 2.220446e-16을 준다.

근사치

다음과 같은 간단한 알고리즘을 사용하여 기계 엡실론의 실제 값에서 2배(크기름의 한 순서) 이내의 인수에 선형 검색을 사용하여 근사하게[clarification needed] 할 수 있다.

엡실론 = 1.0, 반면 (1.0 + 0.5 * 엡실론) ≠ 1.0: 엡실론 = 0.5 * 엡실론 

참고 항목

참고 및 참조

  1. ^ a b 부동 유형 - GNU 컴파일러 컬렉션(GCC) 사용
  2. ^ a b c 십진수 부동 - GNU 컴파일러 모음(GCC) 사용
  3. ^ Higham, Nicholas (2002). Accuracy and Stability of Numerical Algorithms (2 ed). SIAM. p. 37.
  4. ^ "Basic Issues in Floating Point Arithmetic and Error Analysis". 21 Oct 1999. Retrieved 11 Apr 2013.
  5. ^ "LAPACK Users' Guide Third Edition". 22 August 1999. Retrieved 9 March 2012.
  6. ^ "David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic, ACM Computing Surveys, Vol 23, No 1, March 1991" (PDF). Retrieved 11 Apr 2013.
  7. ^ "Scilab documentation - number_properties - determine floating-point parameters". Retrieved 11 Apr 2013.
  8. ^ 여기서 p는 정밀도(즉, 위 표에서 사용된 것과 같이 의미에 포함된 총 비트 수 및 암시적 선행 비트를 포함)로 정의된다.
  9. ^ Jones, Derek M. (2009). The New C Standard - An Economic and Cultural Commentary (PDF). p. 377.
  10. ^ "float.h reference at cplusplus.com". Retrieved 11 Apr 2013.
  11. ^ "std::numeric_limits reference at cplusplus.com". Retrieved 11 Apr 2013.
  12. ^ "Python documentation - System-specific parameters and functions". Retrieved 11 Apr 2013.
  13. ^ "Mathematica documentation: $MachineEpsilon". Retrieved 11 Apr 2013.
  14. ^ "Matlab documentation - eps - Floating-point relative accuracy". Archived from the original on 2013-08-07. Retrieved 11 Apr 2013.
  15. ^ "Octave documentation - eps function". Retrieved 11 Apr 2013.
  16. ^ Higham, Nicholas (2002). Accuracy and Stability of Numerical Algorithms (2 ed). SIAM. pp. 27–28.
  17. ^ Quarteroni, Alfio; Sacco, Riccardo; Saleri, Fausto (2000). Numerical Mathematics (PDF). Springer. p. 49. ISBN 0-387-98959-5. Archived from the original (PDF) on 2017-11-14. Retrieved 2013-04-11.
  18. ^ Press, William H.; Teukolsky, Saul A.; Vetterling, William T.; Flannery, Brian P. Numerical Recipes. p. 890.
  19. ^ Engeln-Müllges, Gisela; Reutter, Fritz (1996). Numerik-Algorithmen. p. 6. ISBN 3-18-401539-4.
  • Anderson, E.; LAPACK 사용자 안내서, 산업 및 응용 수학 협회(SIAM), 필라델피아, PA, 3판, 1999.
  • 코디, William J.; MACHAR: 기계 매개변수를 동적으로 결정하는 Soubroutine, 수학 소프트웨어에 대한 ACM Transactions on Mathemical Software, Vol. 14(4), 1988, 303-311.
  • Besset, Didier H.; Morgan & Kaufmann, San Francisco, CA, 2000.
  • Demmel, James W, 응용수학 선형대수학, 산업 및 응용수학을 위한 협회(SIAM), 필라델피아, PA, 1997.
  • 하이햄, 니콜라스 J; 수치 알고리즘의 정확성과 안정성, 산업 및 응용 수학 협회(SIAM), 필라델피아, PA, 제2판, 2002.
  • 언론, 윌리엄 H;; 테우콜스키, 사울 A; 베터링, 윌리엄 T; 플래너리, 브라이언 P; Fortran 77, 2차 개정판, 20.2, 페이지 881–886의 수치적 조리법
  • 포사이스, 조지 E; 말콤, 마이클 A; Moler, Cleve B.; "수학적 계산을 위한 컴퓨터 방법", 프렌티스 홀, ISBN 0-13-165332-6, 1977

외부 링크