Page semi-protected

배정도 부동소수점 형식

Double-precision floating-point format

배정도 부동소수점 형식(FP64 또는 float64라고도 함)은 보통 컴퓨터 메모리에서 64비트를 차지하는 컴퓨터 번호 형식입니다. 부동소수점을 사용하여 광범위한 동적 수치 범위를 나타냅니다.

부동소수는 분수값을 나타내거나 고정점(같은 비트 폭)에서 제공되는 것보다 넓은 범위가 필요한 경우 정밀도를 희생하더라도 사용됩니다.단정도 범위나 정밀도가 부족할 경우 2배의 정밀도를 선택할 수 있다.

IEEE 754-2008 표준에서는 64비트 base-2 형식을 공식적으로 binary64라고 부릅니다.IEE 754-1985에서는 double이라고 부릅니다.IEEE 754는 32비트 base-2 단일 정밀도 및 최근에는 base-10 표현 등 추가 부동소수점 형식을 지정합니다.

단정밀 부동소수점 데이터 유형을 제공하는 최초의 프로그래밍 언어 중 하나는 Fortran이었습니다.IEEE 754-1985가 널리 채택되기 전에 부동소수점 데이터 유형의 표현과 속성은 컴퓨터 제조업체와 컴퓨터 모델, 그리고 프로그래밍 언어 구현자의 결정에 의존했습니다.예를 들어, GW-BASIC의 두 배 정밀도 데이터 유형은 64비트 MBF 부동 소수점 형식이었습니다.

IEEE 754 배정밀 바이너리 부동소수점 형식: binary64

2정밀 바이너리 부동소수는 성능 및 대역폭 비용에도 불구하고 단정밀 부동소수점보다 범위가 넓기 때문에 PC에서 일반적으로 사용되는 형식입니다.그것은 보통 더블로 알려져 있다.IEEE 754 규격에서는, binary64 는 다음과 같이 지정되어 있습니다.

부호 비트에 의해 번호의 부호가 결정됩니다(이 번호가 0일 때 서명된 을 포함).

지수 필드는 0 ~2047의 11비트 부호 없는 정수이며, 바이어스 형식입니다.지수 값 1023은 실제 0을 나타냅니다.-1023(모든 0) 및 +1024(모든 1)의 지수는 특수 숫자용으로 예약되어 있으므로 지수 범위는 -1022 ~ +1023입니다.

53비트의 중요도와 정밀도는 15~17의 유의한 소수점 정밀도(2÷1−16.11×10)를−53 제공합니다.유효 자리수가 최대 15 자리수의 10 진수를 가지는 문자열을 IEEE 754 배 정밀도 표현으로 변환하고 나서, 같은 자리수의 10 진수 문자열로 다시 변환하면, 최종 결과는 원래의 문자열과 일치합니다.IEEE 754 의 배정밀 번호를 유효 자릿수가 17 이상인 10 진문자열로 변환하고 나서, 다시 배정밀 표현으로 변환하는 경우는, 최종 결과는 원래의 [1]번호와 일치할 필요가 있습니다.

형식은 값 1의 암묵적인 정수 비트를 가진 significate로 기술되어 있습니다(특수 데이터를 제외하고, 다음의 지수 부호화를 참조해 주세요.fraction(F)의 52비트가 유효하고 메모리 형식으로 표시되므로 총 정밀도는 53비트(약 16자리, 5310 log(2)) 15.955)가 됩니다.비트는 다음과 같이 배치됩니다.

IEEE 754 Double Floating Point Format.svg

특정 바이어스 e(\ e 52비트 분율을 갖는 특정 64비트 배 정밀도 데이터가 가정하는 실제 값은 다음과 같습니다.

또는

2=4,503,599,627,496과53 2=9,007,199,254,740,992 사이의52 표현 가능한 숫자는 정확히 정수입니다.다음 범위인54 2부터53 2까지 모든 것에 2를 곱하기 때문에 대표 가능한 숫자는 짝수 등입니다.반대로 앞의 2 ~252 의 범위에서는51, 간격이 0.5 등입니다.

2 ~ 2 범위의nn+1 숫자의 소수인 간격은 2입니다n−52.따라서−53 가장 가까운 대표 수(기계 엡실론)로 반올림할 때의 최대 상대 반올림 오차는 2입니다.

지수의 11비트 폭은 10에서 10308 사이의 숫자를−308 완전한 15~17자리 정밀도로 표현할 수 있습니다.정밀도가 저하됨으로써 정규 이하의 표현은 더 작은 값을−324 약 5 × 10까지 허용합니다.

지수 부호화

배정밀 바이너리 부동 소수점 지수는 오프셋-바이너리 표현을 사용하여 부호화되며, 제로 오프셋은 1023입니다.IEE 754 표준에서는 지수 바이어스라고도 불립니다.그러한 표현의 예는 다음과 같다.

e =000000000012=00116=1: (일반 숫자의 경우 지수 표시)
e =011111111112=3ff16=1023: (오프셋 제로)
e =100000001012=40516=1029:
e =111111111102=7fe16=2046: (최고 지수)

지수00016그리고.7ff16특별한 의미가 있습니다.

  • 000000000002=00016부호 있는 0(F = 0인 경우)과 하위 정규(F 0 0인 경우)를 나타내기 위해 사용된다.
  • 111111111112=7ff16 δ(F = 0인 경우) NaNs(F ≠ 0인 경우)를 나타내기 위해 사용됩니다.

여기서 F는 유의값의 부분이고모든 비트 패턴이 유효한 인코딩입니다.

위의 예외를 제외하고 전체 배 정밀도는 다음과 같이 기술됩니다.

하위 정규성(e = 0)의 경우 이중 소수점 숫자는 다음과 같이 설명됩니다.

엔디안니스

많은 프로세서가 모든 유형의 데이터(정수, 부동소수점)에 대해 리틀 엔디언 스토리지를 사용하지만 부동소수점 숫자는 빅 엔디언 형식으로 표현되고 정수는 리틀 엔디언 [2]형식으로 표현되는 하드웨어 아키텍처가 많이 있습니다.ARM 프로세서는 2배 정밀도의 숫자를 little-endian, big-endian 부동소수점 표현으로 나타낸 것이 있습니다.두 32비트 워드 모두 정수 레지스터와 같이 little-endian으로 저장되지만 가장 중요한 것은 첫 번째입니다.VAX 부동소수점에서는 리틀 엔디안 16비트 워드를 빅 엔디안 순서로 저장합니다.네트워크 표준 표현이 없는 부동소수점 형식이 다수 존재하기 때문에 XDR 표준에서는 빅엔디안 IEEE 754를 표현으로 사용합니다.따라서 광범위한 IEEE 754 부동소수점 표준이 엔디안을 지정하지 않는 것은 [3]이상하다고 생각될 수 있습니다.이론적으로 이는 한 머신에 의해 작성된 표준 IEEE 부동소수점 데이터조차 다른 머신에 의해 판독되지 않을 수 있음을 의미합니다.그러나, 현대의 표준 컴퓨터(즉, IEEE 754의 실장)에서는, 엔디안니스(endianness)는 정수와 부동소수점수가 동일하다고 가정할 수 있어 데이터 타입에 관계없이 변환이 간단하다.그러나 특별한 부동소수점 형식을 사용하는 소형 임베디드 시스템은 다른 문제일 수 있습니다.

2배 정밀도 예시

011111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000002+2160×1=1
01111110000000000000000000000000000000000000000000000000012 3 3FF0000000000000000000000116 10 + 2 × ( 1 + 2−52) ≈ 1.0000000000000000002, 최소수 > 1
011111100000000000000000000000000000000000000000000102 10 3FF00000000000000000000000000000000000002160 + + 2 × ( 1 + 2−51) 1 1.000000000000000000004
0 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002+216×1=21
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022×1161=-2
0 10000000000000000000000000000000000000000000000000000000000000000000000000000000000002+22×116.1=1112 = 3
0 100000000012 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001622
0100000000012 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016222
0 100000000012 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016222
0100000011 011100000000000000000000000000000000000000000000000000000000000000000000002+2×1164.0111=1011122=23
011111000 1000000000000000000000000000000000000000000000000000000000000000000000002 3 3F880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016−722
0 0000000000000000000000000000000000000000000000000000000012 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000116 4−1074+2−1022 54+2 =2 4464654654654654654×10−52−324(최소수)
0 000000000 111111111111111111111111111111111111111111000F2 FFFFF16 + +2−1022 × (1−52 - 2) 2 2.225073858507 × 10−308 (최대 하위표준)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216−1022−308
0 11111111111111111111111111111111111111111111111111111172 7 7FEFFFFFFF16 + + 21023 × ( 1 + ( 1 - 2−52) 1 1.79313486237 × 10308 (최대 더블)
0 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002+016
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216 -0
0 1111111 0000000000000000000000000000000000002 77FF00000000000000000000000000000000000000000000016+" (정의 무한대)
1111111 000000000000000000000000000000000000000000000000000000000000002 11FF00000000000000000000016(음수 무한대)
0 1111111 00000000000000000000000000000000000012 77FF00000000000000000000000116 naNaN(x86 및 ARM 등 대부분의 프로세서에서 sNaN)
0 1111111 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000NaN216(x86 및 ARM 등 대부분의 프로세서에서 qNaN)
0 111111111111111111111111111111111111111111117FFFFFFNaN216(NaN의 대체 부호화)
01111111 0101010101010101010101012 = 3FD5 5555555555516 + + 2−2 × ( 1 + 2−2−4 + 2 + ... + 2−52) 3≈ /
0 100000000 100100001111010101000100001010101010000110110002 = 400921FB 5444 2D1816 † pi

qNaNsNaN의 인코딩은 IEEE 754에서 완전히 규정되어 있지 않으며 프로세서에 의존합니다.x86 패밀리 및 ARM 패밀리프로세서 등 대부분의 프로세서는 significant 필드의 최상위 비트를 사용하여 조용한 NaN을 나타냅니다.이것은 IEEE 754에서 권장되는 것입니다.PA-RISC 프로세서는 비트를 사용하여 시그널링 NaN을 나타냅니다.

디폴트로는 3/는 유효값의 홀수 비트수로 인해 단일 정밀도처럼 올림되지 않고 반올림됩니다.

상세:

16진수 표현 3FD5 55555555가16 주어졌을 때, 부호 = 0 지수 = 3FD = 1021 지수 바이어스 = 1023(위 참조) 분수 = 555555555516 값 = 2(Exponent − Exponent Bias) × 1입니다.분수 – 여기서 분수는 소수점 이하로는−2 변환할 수 없습니다.= 2 × (15 5555555555516−52 × 2) = 2−54 × 15 55555555555555555516 = 0.3333333333333339339624562473909939472198486328125 1

배정밀 산술에 의한 실행 속도

이중 정밀도 부동 소수점 변수와 수학적 함수(예: sin, cos, atan2, log, exp 및 sqrt)를 사용하는 것은 단일 정밀도 대응 변수보다 속도가 느립니다.이것이 특정 문제가 되는 컴퓨팅 분야 중 하나는 GPU에서 실행되는 병렬 코드입니다.예를 들어 NVIDIA의 CUDA 플랫폼을 사용하는 경우 하드웨어에 따라 2배의 정밀도로 계산하면 단일 [4]정밀도로 계산했을 때보다 약 2배에서 32배의 시간이 소요됩니다.

정수값에 대한 정밀도 제한

  • -253 ~ 253 의 정수(-9,007,199,254,740,992 ~9,199,254,740,992)는 정확하게 나타낼 수 있습니다.
  • 2와54 2 사이의53 정수 = 18,014,398,509,481,984를 2의 배수(짝수)로 반올림
  • 2와55 2 사이의54 정수 = 36,028,797,018,963,968의 4의 배수 반올림

실장

여러 프로그래밍 언어에서 다음과 같은 다양한 방법으로 이중화가 구현됩니다.SSE2를 사용하지 않는 x86(또는 호환성을 위해 SSE2를 사용하지 않는 경우)과 같은 동적 정밀도만을 가진 프로세서에서는 기본적으로 사용되는 정밀도가 확장되어 있는 경우 소프트웨어가 일부 요건을 충족하는 데 어려움을 겪을 수 있습니다.

C 및 C++

C와 C++는 다양한 산술 유형을 제공합니다.표준(IEEE 754 산술을 다루는 C99의 선택적 부속서 F 제외)에 의해 이중 정밀도가 요구되지는 않지만, 대부분의 시스템에서는doubletype은 이중 정밀도에 해당합니다.단, 디폴트로는 정밀도가 확장된32비트 x86에서는 일부 컴파일러가 C표준에 준거하지 않거나 계산이 이중 반올림될 [5]있습니다.

포트란

Fortran은 몇 가지 정수형 및 실수형과 64비트형을 제공합니다.real64Fortran의 고유 모듈을 통해 액세스 가능iso_fortran_env는 2배의 정밀도에 대응합니다.

일반적인 리스프

공통 리스프는 SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT 및 LONG-FLOAT 유형을 제공합니다.대부분의 구현에서는 SINGLE-FLOAT 및 DUBLE-FLOAT에 다른 유형의 적절한 동의어가 제공됩니다.Common Lisp는 IEEE 754에 따라 부동소수점 언더플로우 및 오버플로우를 포착하기 위한 예외와 부정확한 부동소수점 예외를 제공합니다.ANSI 표준에는 무한 및 NaN이 기술되어 있지 않지만, 여러 구현에서 확장으로 제공됩니다.

자바

버전 1.2 이전의 Java에서는 모든 구현이 IEEE 754에 준거해야 했습니다.버전 1.2에서는 x87과 같은 플랫폼의 중간 연산에 있어 구현의 정밀도가 향상되었습니다.따라서 엄격한 IEEE 754 계산을 적용하기 위해 strictfp라는 수식어가 도입되었습니다.Java [6]17에서는 엄밀한 부동 소수점이 복원되었습니다.

자바스크립트

ECMAScript 규격에 따라 JavaScript의 모든 연산은 2배 정밀 부동 소수점 [7]연산을 사용하여 수행되어야 한다.

JSON

JSON 데이터 인코딩 형식은 숫자 값을 지원하며 숫자 표현이 적합해야 하는 문법은 인코딩된 숫자의 정밀도 또는 범위에 제한이 없습니다.단, RFC 8259에서는 IEEE 754 binary64 번호가 폭넓게 실장되어 있기 때문에 binary64보다 [8]높은 정밀도 또는 범위가 필요한 경우 JSON을 처리함으로써 양호한 상호 운용성을 실현할 수 있다고 조언하고 있습니다.

「 」를 참조해 주세요.

  • IEEE 754, 부동 소수점 산술용 IEEE 표준

주 및 참고 자료

  1. ^ William Kahan (1 October 1997). "Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic" (PDF). Archived (PDF) from the original on 8 February 2012.
  2. ^ Savard, John J. G. (2018) [2005], "Floating-Point Formats", quadibloc, archived from the original on 2018-07-03, retrieved 2018-07-16
  3. ^ "pack – convert a list into a binary representation".
  4. ^ "Nvidia's New Titan V Pushes 110 Teraflops From A Single Chip". Tom's Hardware. 2017-12-08. Retrieved 2018-11-05.
  5. ^ "Bug 323 – optimized code gives strange floating point results". gcc.gnu.org. Archived from the original on 30 April 2018. Retrieved 30 April 2018.
  6. ^ Darcy, Joseph D. "JEP 306: Restore Always-Strict Floating-Point Semantics". Retrieved 2021-09-12.
  7. ^ ECMA-262 ECMAScript Language Specification (PDF) (5th ed.). Ecma International. p. 29, §8.5 The Number Type. Archived (PDF) from the original on 2012-03-13.
  8. ^ "The JavaScript Object Notation (JSON) Data Interchange Format". Internet Engineering Task Force. December 2017. Retrieved 2022-02-01.