4배 정밀도의 부동 소수점 형식

Quadruple-precision floating-point format

컴퓨팅에서 4배 정밀도(또는 4배 정밀도)는 53비트의 2배 이상의 정밀도로 16바이트(128비트)를 차지하는 이진 부동소수점 기반의 컴퓨터 번호 형식입니다.

이 128비트의 4배 정밀도는 [1]2배 이상의 정밀도를 필요로 하는 어플리케이션용으로 설계되어 있을 뿐만 아니라 일차 함수로서 중간 계산과 스크래치 변수의 오버플로 및 반올림 오류를 최소화함으로써 2배 정밀도 결과를 보다 신뢰성 있고 정확하게 계산할 수 있도록 설계되었습니다.최초의 IEEE-754 부동소수점 표준의 주요 설계자인 William Kahan은 다음과 같이 말했습니다.현재로서는 10바이트 확장 포맷은 초정밀 산술의 가치와 고속 실행을 위한 구현 비용 사이에서 충분히 타협할 수 있습니다.조만간 2바이트의 정밀도가 허용되고 최종적으로 16바이트 형식이 될 것입니다.IEEE Floating Point 산술 표준 754가 만들어졌을 때, 보다 넓은 정밀도를 향한 이러한 점진적인 진화가 이미 가시화되었습니다."[2]

IEEE 754-2008에서는 128비트 base-2 포맷은 공식적으로 binary128이라고 불립니다.

IEEE 754 4배 정밀도의 바이너리 부동소수점 형식: binary128

IEEE 754 규격에서는 바이너리128은 다음과 같이 규정되어 있습니다.

이 값은 유효 소수점 이하 33 ~36 의 정밀도를 나타냅니다.유효 자릿수가 최대 33자리인 10진수 문자열을 IEEE 754의 4배 정밀도 표현으로 변환한 후 같은 자릿수의 10진수 문자열로 다시 변환하면 최종 결과는 원래 문자열과 일치합니다.IEEE 754의 4중 정밀도를 36자리 이상의 유효 자릿수를 가진 10진수 문자열로 변환한 후 4중 정밀도 표현으로 다시 변환하는 경우 최종 결과는 원래 [3]숫자와 일치해야 합니다.

이 형식은 지수가 모두 0으로 저장되지 않는 한 값이 1인 암묵적인 리드 비트로 작성됩니다.따라서 메모리 형식에는 112비트밖에 표시되지 않지만 총 정밀도는 113비트(약 34자리 소수10: log (2) 2113 34.016)입니다.비트는 다음과 같이 배치됩니다.

A sign bit, a 15-bit exponent, and a 112-bit significand

바이너리 256은 237비트(약 71자리 소수)의 유효 정밀도와 지수 바이어스 262143을 가집니다.

지수 부호화

4배 정밀도의 바이너리 부동 소수점 지수는 오프셋 바이너리 표현을 사용하여 부호화되며, 제로 오프셋은 16383입니다.이것은 IEEE 754 표준에서는 지수 바이어스라고도 불립니다.

  • Emin = 000116 - 3FF16 = -16382
  • Emax = 7FFE16 - 3FF16 = 16383
  • 지수 바이어스 = 3FF16 = 16383

따라서 오프셋 이진 표현에 의해 정의된 대로, 진정한 지수를 얻으려면 저장된 지수에서 오프셋 16383을 빼야 합니다.

저장된 지수 000016 및 7FFF는16 특별히 해석됩니다.

지수 유의와 제로 유의 및 0이 아닌 경우 방정식
000016 0, −0 정규 이하의 수 (-1)signbit × 2−16382 × 0.gbpsandbits2
000116, ..., 7FFE16 정규화 값 (-1)signbit × 2exponentbits2 − 16383 × 1. 비트2
7FF16 ±160 NaN(저소음, 시그널링)

최소 엄밀하게 양의 값(비정상)은−16494 2 and−4965 10이며 정밀도는 1비트입니다.최소 양의 정규값은 2 † 3.3621−4932 × 10이며−16382 정밀도는 113비트, 즉 ±2입니다−16494.최대 표시값은 216384 - 216271 1.1897 × 10 입니다4932.

4배 정밀도 예시

이러한 예는 부동소수점 값의 비트 표현(16진수)으로 제시되어 있습니다.여기에는 부호, (편향된) 지수 및 유의 및 가 포함됩니다.

0000 0000 0000 0000 0000 000016 0001−16382 = 2−112 × 2 = 2−16494 6 6.4751751194380251109244389582276465525 × 10−4966 (양수 이하)
0000 fff fff fff fff fff16 = 2−16382 × (1 - 2−112) )≈ 3.3621031431120935062677817321775551 × 10 (최대−4932 미정규수)
0001 0000 0000 0000 0000 000016 = 2−16382 ≈ 3 . 36210314311209350626778173217526026 × 10−4932 (정규수)
7fe fff fff fff fff fff fff16 = 216383 × (2−112 - 2) ≈ 1.1407314957231765085932662800702 × 104932 (통상 최대수)
3fe fff fff fff fff fff fff16 = 1 - 2−113 ≈ 0 . 999999999999999999999037 (최대번호는 1개 미만)
3ff 00000000000000000000000000=116 ( 1 )
3ff 00000000000000000000000000116 =1−112 + 2 1 1.0000000000000000000000000000000000000000000000001926 (1보다 큰 번호)
c000 0000 0000 0000 0000 000016 = - 2
0000000000000000000000000016=0800000000000000000000000000016=-0
7ff 0000000000000000000016=무한fff 0000000000000000000000000000000016=-filenity
4000 921f b544 42d1 8469 898c c517 01b816 ≈ 4000
3fd 55555555555555555555555516 1 1/3

디폴트로는 1/3은 유효값의 홀수 비트수 때문에 2배의 정밀도로 반올림됩니다.반올림점 너머의 비트는0101...꼴찌 단위의 1/2보다 작습니다.

이중산술

2배 정밀도 값의 쌍을 사용하여 거의 4배 정밀도를 구현하는 일반적인 소프트웨어 기술을 2배 이중 [4][5][6]산술이라고 부르기도 합니다.53-bit significands과 IEEE배정 밀도 값 쌍을 사용하여double-double 산수를 least[4]2×53=106비트(규모가 가장 큰 값을 제외하고 제한된 지수 범위 때문에 실제로 107bits[7],), 오직 약간 덜 IEEEbinary128 싶어의113-bit significand보다 정확한의 significands과 숫자에 작전을 제공한다.adru정확성을 기하다2배의 범위는 기본적으로 2배의 정밀도 포맷과 동일하게 유지되는데, 이는 지수가 IEEE 4배의 정밀도의 15비트 지수보다 훨씬 낮은 11비트를 [4]가지고 있기 때문이다(2배의 경우 1.10308, 2진수128의 경우 1.2×104932).

특히, 이중 이중화 기법의 이중 이중화/중간화 값 q는 각각 [5]q의 유효값의 절반을 제공하는 2개의 이중화 값 x 및 y의 합계 q = x + y로 암묵적으로 표현된다.즉, q 대신 (x, y)이 저장되고 q 값(+, -, ×, ...)대한 연산이 x y 값에 대한 등가 연산(단, 더 복잡한)으로 변환됩니다.따라서, 이 기술의 산술은 일련의 2배 정밀 연산으로 감소합니다. 2배 정밀 연산은 일반적으로 하드웨어에서 구현되기 때문에, 2배 이중 연산은 일반적으로 더 일반적인 임의 정밀 연산 [4][5]기술보다 상당히 빠릅니다.

이중 이중 산술에는 다음과 같은 특수 특성이 있습니다.[8]

  • 값의 크기가 감소하면 정밀도도도 감소합니다.따라서 정규화 범위에서 가장 작은 숫자는 이중 정밀도보다 좁습니다.최대 정밀도를 갖는 최소 숫자는 10002...0−1074(106 영) × 2 또는 1.0002...0(106 영) × 2입니다−968. 크기가 2보다 작은−1021 숫자는 2배 정밀도에 비해 추가 정밀도를 갖지 않습니다.
  • 실제 정밀도 비트 수는 다를 수 있습니다.일반적으로 수의 하위 부분의 크기는 상위 부분의 ULP 절반 이하이다.하위 부품이 상위 부품의 절반 ULP 미만일 경우 상위 번호와 하위 번호의 유의한 사이에 유의한 비트(모두 0 또는 모두 1)가 암시됩니다.128비트 길이의 이중번호를 사용하면 특정 알고리즘이 실패할 수 있습니다.
  • 위의 이유로 1 + 2−1074 같은 을 나타낼 수 있습니다.이것은 1보다 큰 최소의 수치입니다.

또, 2중 연산에 가세해 고정밀 부동소수점 라이브러리 없이 고정밀이 필요한 경우에는 3중 또는 4중 연산을 생성할 수도 있다.각각 3(또는 4)의 배 정밀도 값의 합으로 표시됩니다.각각 최소 159/161 및 212/215비트의 연산을 나타낼 수 있습니다.

두 개의 4중 정밀도 값의 합으로 표현되는 2중 4중 산술 생성에도 유사한 기술을 사용할 수 있다.이들은 최소 226([9]또는 227)비트로 작업을 나타낼 수 있습니다.

실장

4중 정밀도는 다양한 기술(위의 2중 기술, IEEE 4중 정밀도는 구현되지 않지만)에 의해 소프트웨어에서 구현되는 경우가 많습니다. 2016년 현재 4중 정밀도에 대한 직접적인 하드웨어 지원은 흔하지 않기 때문입니다(아래의 "하드웨어 지원" 참조).일반 임의 정밀도 산술 라이브러리를 사용하여 4배(또는 더 높은) 정밀도를 얻을 수 있지만, 전문화된 4배 정밀도 구현은 더 높은 성능을 달성할 수 있습니다.

컴퓨터 언어 지원

또 다른 질문은 4배 정밀도의 타입이 컴퓨터 프로그래밍 언어에 직접 통합되는 정도에 관한 것입니다.

4배 정밀도는 Fortran에 의해 지정됩니다.real(real128)(비활성화)iso_fortran_envFortran 2008부터의 경우,real128대부분의 프로세서에서 16과 같거나real(selected_real_kind(33, 4931))또는 비표준적인 방법으로REAL*16. (4정밀)REAL*16는 인텔 Fortran[10] 컴파일러 및 x86, x86-64Itanium 아키텍처의 GNU Fortran[11] 컴파일러에 의해 지원됩니다.)

C 프로그래밍 언어의 경우 ISO/IEC TS 18661-3(C, 교환 및 확장 유형에 대한 부동 소수점 확장)은 다음을 지정합니다._Float128IEEE 754 쿼드러플 정밀도 포맷(바이너리128)[12]을 실장하는 타입으로 합니다.또는 시스템이나 컴파일러가 몇 개 있는 C/C++에서는 4배의 정밀도를 긴 더블 타입으로 지정할 수 있습니다만, 이것은 언어에서는 필요 없습니다(필요한 것은 이것뿐입니다).long double적어도 와 같은 정확성을 가지다double)도 일반적이지 않습니다.

x86 및 x86-64에서는 가장 일반적인 C/C++ 컴파일러가 구현됩니다.long double80비트 확장 정밀도(예를 들어 GNU C 컴파일러[13] gcc 및 인텔 C++ 컴파일러와/Qlong‑double스위치[14]) 또는 단순히 4배 정밀도가 아닌 2배 정밀도(예: Microsoft Visual C++)[15]와 동의어로 사용됩니다.ARM 64비트아키텍처(AArch64)의 프로시저 콜표준에서는 다음과 같이 규정되어 있습니다.long double는 IEEE 754 쿼드러플 정밀도의 [16]포맷에 대응하고 있습니다.기타 아키텍처에서는 C/C++ 컴파일러 중 일부는long double예를 들어 PowerPC(더블[17][18][19] 더블) 및 SPARC의 gcc,[20][21] SPARC의 Sun Studio 컴파일러 등 4배의 정밀도로 사용할 수 있습니다.라 할지라도long double는 4배의 정밀도는 아닙니다만, 일부 C/C++ 컴파일러는 확장으로서 비표준의 4배의 정밀도 타입을 제공하고 있습니다.예를 들어 gcc는 다음과 같은 4배 정밀도의 유형을 제공합니다.__float128x86,[22] x86-64 및 Itanium CPU용 및 전원-mfloat128-hardware 또는 -mfloat128 [23]옵션을 사용하여 IEEE 128비트 부동소수점으로서 PC를 사용합니다.또한 인텔의 C/C++ 컴파일러 x86 및 x86-64 버전은 비표준 4배 정밀도 타입을 제공합니다._Quad를 클릭합니다.[24]

라이브러리 및 도구 상자

  • GCC 4정밀 연산 라이브러리 libquadmath는 다음을 제공합니다.__float128그리고.__complex128운용을 실시합니다.
  • 다중 정밀도 라이브러리 부스트.Multiprecision은 통합 크로스 플랫폼 C++ 인터페이스를 제공합니다.__float128그리고._Quad표준 산술 라이브러리의 [25]커스텀 구현을 포함합니다.
  • MATLAB용 Multprecision Computing Toolbox는 MATLAB에서 4배 정밀도의 계산을 가능하게 합니다.이것은 기본적인 산술 기능뿐만 아니라 수치 방법, 조밀하고 희박한 선형 [26]대수를 포함한다.
  • DoubleFloats[27] 패키지는 Julia 프로그래밍 언어의 이중 연산을 지원합니다.
  • doubledouble[28].py 라이브러리는 Python에서 이중 연산을 가능하게 합니다.
  • Mathematica는 IEEE 4정밀 번호(128비트 부동소수점 값(Real128) 및 256비트 복소수 값(Complex256)[citation needed]을 지원합니다.

하드웨어 지원

IEEE 4배 정밀도는 1998년 [29]IBM System/390 G5에 추가되었으며 이후 z/Architecture [30][31]프로세서의 하드웨어에서 지원됩니다.IBM POWER9 CPU(Power ISA 3.0)는 128비트 하드웨어를 기본적으로 지원합니다.[23]

IEEE 128비트 플로트의 네이티브 지원은 PA-RISC 1.0 [32]SPARC V8[33] 및 V9[34] 아키텍처(예를 들어 16개의 쿼드 정밀 레지스터 %q0, %q4, ...)에서 정의되어 있지만 2004년 [35]현재 하드웨어에 쿼드 정밀도 동작을 구현하는 SPARC CPU는 없습니다.

비 IEEE 확장 정밀도(스토리지 128비트, 1 부호 비트, 7 지수 비트, 112 분수 비트, 8 비트 미사용)는 IBM System/370 시리즈(1970~1980년대)에 추가되었으며, 1960년대 일부 System/360 모델(시스템/360-85,[36] -195 및 기타 OS 소프트웨어에서 특별 요청 또는 시뮬레이션)에서 사용 가능했습니다.

Siemens 7.700 및 7.500 시리즈 메인프레임과 후속 제품은 IBM System/360 및 System/370과 동일한 부동 소수점 형식 및 명령을 지원합니다.

VAX 프로세서는 비 IEEE 4배 정밀도의 부동 소수점을 "H 부동 소수점" 형식으로 구현했습니다.그것은 하나의 부호 비트, 15비트 지수 및 112-fraction 비트를 가지고 있었지만, 메모리의 레이아웃은 IEEE 4배 정밀도와는 크게 달랐고 지수 바이어스도 달랐다.초기 VAX 프로세서 중 일부만이 하드웨어에 H 부동소수점 명령을 구현했으며, 다른 모든 프로세서는 소프트웨어에서 H 부동소수점을 에뮬레이트했습니다.

RISC-V 아키텍처에서는 128비트 바이너리 IEEE 754-2008 부동소수점 [37]산술용 Q(정밀도 4분의 1) 확장을 지정합니다.L 확장자(아직 인증되지 않음)는 64비트 및 128비트 10진 부동소수를 [38]지정합니다.

4중 정밀도(128비트) 하드웨어 구현은 스트리밍 SIMD 확장이나 AltiVec 등 SIMD 명령을 구현하는 '128비트 FPU'와 혼동하지 마십시오.이러한 FPU는 동시에 동작하는4개의 32비트 단정도 값 또는2개의 64비트 이중정도 값의 128비트 벡터를 말합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ David H. Bailey; Jonathan M. Borwein (July 6, 2009). "High-Precision Computation and Mathematical Physics" (PDF).
  2. ^ Higham, Nicholas (2002). "Designing stable algorithms" in Accuracy and Stability of Numerical Algorithms (2 ed). SIAM. p. 43.
  3. ^ William Kahan (1 October 1987). "Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic" (PDF).
  4. ^ a b c d 히다 요조, 리 X, DH. Bailey, 쿼드 더블 연산: 알고리즘, 구현 및 응용, Lawrence Berkeley National Laboratory Technical Report LBNL-46996(2000).Y도.Hida 등, 더블 더블쿼드 더블 산술 라이브러리(2007).
  5. ^ a b c J. R. Shewchuk, Adaptive Precision 부동소수점 연산고속 로버스트 기하학 술어, 이산계산 기하학 18:305–363, 1997.
  6. ^ Knuth, D. E. The Art of Computer Programming (2nd ed.). chapter 4.2.3. problem 9.
  7. ^ Robert Munafo F107 F161 고정밀 부동 소수점 데이터 유형(2011).
  8. ^ 128비트 길이 더블 부동소수점 데이터 타입
  9. ^ sourceware.org 관련 정보: glibc libm 상태
  10. ^ "Intel Fortran Compiler Product Brief (archived copy on web.archive.org)" (PDF). Su. Archived from the original on October 25, 2008. Retrieved 2010-01-23.{{cite web}}: CS1 유지보수: 부적합한 URL(링크)
  11. ^ "GCC 4.6 Release Series - Changes, New Features, and Fixes". Retrieved 2010-02-06.
  12. ^ "ISO/IEC TS 18661-3" (PDF). 2015-06-10. Retrieved 2019-09-22.
  13. ^ i386 x86-64 옵션(web.archive.org에서 다운로드 가능), GNU 컴파일러 컬렉션 사용.
  14. ^ 인텔 개발자 사이트
  15. ^ MSDN 홈페이지, Visual C++ 컴파일러 정보
  16. ^ "Procedure Call Standard for the ARM 64-bit Architecture (AArch64)" (PDF). 2013-05-22. Archived from the original (PDF) on 2019-10-16. Retrieved 2019-09-22.
  17. ^ RS/6000PowerPC 옵션(GNU 컴파일러 컬렉션 사용)
  18. ^ Macintosh 내부 - PowerPC 수치 2012년 10월 9일 Wayback Machine에서 아카이브
  19. ^ Darwin을 위한 128비트 길이의 이중 지원
  20. ^ GNU 컴파일러 컬렉션을 사용한SPARC 옵션
  21. ^ 수학 라이브러리, Sun Studio 11 수치 계산 가이드(2005).
  22. ^ GNU 컴파일러 컬렉션을 사용기타 부동 유형
  23. ^ a b "GCC 6 Release Series - Changes, New Features, and Fixes". Retrieved 2016-09-13.
  24. ^ 인텔 C++ 포럼 (2007)
  25. ^ "Boost.Multiprecision - float128". Retrieved 2015-06-22.
  26. ^ Pavel Holoborodko (2013-01-20). "Fast Quadruple Precision Computations in MATLAB". Retrieved 2015-06-22.
  27. ^ "DoubleFloats.jl".
  28. ^ "doubledouble.py".
  29. ^ Schwarz, E. M.; Krygowski, C. A. (September 1999). "The S/390 G5 floating-point unit". IBM Journal of Research and Development. 43 (5/6): 707–721. doi:10.1147/rd.435.0707. Retrieved October 10, 2020.
  30. ^ Gerwig, G. and Wetter, H. and Schwarz, E. M. and Haess, J. and Krygowski, C. A. and Fleischer, B. M. and Kroener, M. (May 2004). "The IBM eServer z990 floating-point unit. IBM J. Res. Dev. 48; pp. 311-322".{{cite news}}: CS1 maint: 여러 이름: 작성자 목록(링크)
  31. ^ Eric Schwarz (June 22, 2015). "The IBM z13 SIMD Accelerators for Integer, String, and Floating-Point" (PDF). Retrieved July 13, 2015.
  32. ^ "Implementor support for the binary interchange formats". grouper.ieee.org. Archived from the original on 2017-10-27. Retrieved 2021-07-15.
  33. ^ The SPARC Architecture Manual: Version 8 (archived copy on web.archive.org) (PDF). SPARC International, Inc. 1992. Archived from the original (PDF) on 2005-02-04. Retrieved 2011-09-24. SPARC is an instruction set architecture (ISA) with 32-bit integer and 32-, 64-, and 128-bit IEEE Standard 754 floating-point as its principal data types.
  34. ^ David L. Weaver; Tom Germond, eds. (1994). The SPARC Architecture Manual: Version 9 (archived copy on web.archive.org) (PDF). SPARC International, Inc. Archived from the original (PDF) on 2012-01-18. Retrieved 2011-09-24. Floating-point: The architecture provides an IEEE 754-compatible floating-point instruction set, operating on a separate register file that provides 32 single-precision (32-bit), 32 double-precision (64-bit), 16 quad-precision (128-bit) registers, or a mixture thereof.
  35. ^ "SPARC Behavior and Implementation". Numerical Computation Guide — Sun Studio 10. Sun Microsystems, Inc. 2004. Retrieved 2011-09-24. There are four situations, however, when the hardware will not successfully complete a floating-point instruction: ... The instruction is not implemented by the hardware (such as ... quad-precision instructions on any SPARC FPU).
  36. ^ Padegs A (1968). "Structural aspects of the System/360 Model 85, III: Extensions to floating-point architecture". IBM Systems Journal. 7: 22–29. doi:10.1147/sj.71.0022.
  37. ^ RISC-V ISA 사양 v. 20191213, 13장, 쿼드 정밀도 부동 소수점용 "Q" 표준 확장, 79페이지.
  38. ^ [1] 제15장 (95페이지)

외부 링크