단정도 부동소수점 형식

Single-precision floating-point format

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

부동소수점 변수는 같은 비트폭의 고정소수점 변수보다 더 넓은 범위의 숫자를 나타낼 수 있습니다.부호 있는 32비트 정수 변수의 최대값은 231 - 1 = 2,440,483,647입니다만, IEEE 754 32비트 base-2 부동소수점 변수의 최대값은 (2 - 2−23) × 2127 3 3.402823538 × 10입니다.소수점 이하가 7자리 이하인 모든 정수와 정수가 -149µnµ127인 임의의n 2는 IEEE 754 단정도 부동소수점 값으로 정확하게 변환할 수 있습니다.

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

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

단일 정밀도는 Fortran에서는 [1]REAL, Common [2]Lisp에서는 SINGLE-FLOAT, C, C++, C#, Java,[3] Haskell[4][5]Swift에서는 Float, Object Pascal(Delphi), Visual Basic 및 MATLAB에서는 Single이라고 합니다.그러나 Python, Ruby, PHPOCaml에서는 float, 3.2 이전 버전의 옥타브에서는 single은 2배 정밀도를 나타냅니다.대부분의 PostScript 구현 및 일부 임베디드 시스템에서는 지원되는 정밀도는 싱글입니다.

IEEE 754 표준: binary32

IEEE 754 규격에서는 binary32는 다음과 같이 지정되어 있습니다.

이는 6 ~ 9 의 유의한 소수점 정밀도를 제공합니다.유효 자리수가 최대 6 자리수의 10 진수를 가지는 문자열을 IEEE 754 단정도 표현으로 변환하고 나서, 같은 자리수의 10 진수 문자열로 다시 변환하면, 최종 결과는 원래의 문자열과 일치합니다.IEEE 754 단정도 번호가 유효 자리수 이상의 10진수 문자열로 변환된 후 단정도 표현으로 다시 변환된 경우 최종 결과는 원래 [6]숫자와 일치해야 합니다.

부호 비트에 의해 숫자의 부호가 결정되며, 이는 의미와 의미도 마찬가지입니다.지수는 0 ~ 255 사이의 8비트 부호 없는 정수이며, 127의 지수 값은 실제 0을 나타냅니다.-127(모든 0) 및 +128(모든 1)의 지수는 특수 숫자용으로 예약되어 있으므로 지수 범위는 -126 ~ +127입니다.

true significant는 지수가 모두 0으로 저장되지 않는 한 이진 포인트 오른쪽에 23개의 분수 비트와 값이 1인 암묵적 선행 비트(바이너리 포인트 왼쪽에 있음)를 포함합니다.따라서 메모리 형식에는 의 23개의 부분 비트만 표시되지만 총 정밀도는 24비트(log(224)≈ 7.225의 소수점 이하에 상당10)입니다.비트는 다음과 같이 배치됩니다.

Float example.svg

특정 부호, 바이어스 지수 e(8비트 부호 없는 정수) 및 23비트 분율을 가진 특정 32비트 binary32 데이터에 의해 가정되는 실제 값은 다음과 같습니다.

- ) × ( b )2 ×( . b ... ( \ ( - 1 )^{_ { 31 } \ ^{ ( } b _ { } \ times b _ { ( ._ b _ 22 b _ b _ b _ )

그 결과

이 예에서는 다음과 같습니다.

  • { { { } =_ { } =,
  • -) (-) 0 + { -, + { { ( - }= }=+
  • b i 23 + 2 + = 124 { , ,( - )- 1{ , ... , { E=b _ { }b _ { 23 } \ _ 23_ {}^{ }
  • ( - 124 - { - , 2 = { - 127 = { - } \ \ { ^ { - } , \ ,},
  • _}= 225,\}\cdots,2-23,[]

다음과 같이 됩니다.

  • ( + )× 2 - × 1. + 0.{ { {} 2^ { - } \ 1= + . }

주의:

  • + - 1. 119( \ 1 + ^ { - }\ 1. , ,
  • - - 1 . \ 2 - 2 ^ { - } )약 1
  • - 1. 35 - ({ 2 ^ { - } )1.\ 10 ^ { ,
  • + 83 (\ 21. 10

지수 부호화

단정도 바이너리 부동소수점 지수는 오프셋-바이너리 표현을 사용하여 부호화되며 제로 오프셋은 127입니다.IEE 754 표준에서는 지수 바이어스라고도 불립니다.

  • Emin = 01-7FHH = -180
  • Emax = FE-7FHH = 127
  • 지수 바이어스 = 7FH = 127

따라서 오프셋-바이너리 표현에 의해 정의된 진정한 지수를 얻기 위해서는 저장된 지수에서 오프셋 127을 빼야 합니다.

저장된 지수H 00 및 FF는H 특별히 해석됩니다.

지수 fraction = 0 fraction 0 0 방정식
00H = 000000002 ±0 정규 이하의 수
01H, ..., FEH = 000000012, ..., 1111102 정상값
FFH = 11111112 ±160 NaN(저소음, 시그널링)

최소 양의 정규값은2 - 1× - 2이고, 최소 양의(비정규) 값은 - .4× - {-입니다

10진수를 2진수로 변환32

일반적으로 실수의 등가 바이너리32 형식으로의 엄밀한 변환(반올림 동작을 포함한다)에 대해서는, IEEE 754 규격 자체를 참조해 주세요.

여기에서는 다음 개요를 사용하여 Base-10의 실수를 IEEE 754 binary32 형식으로 변환하는 방법을 보여 줍니다.

  • 12.375와 같은 정수와 소수 부분이 있는 실수를 고려합니다.
  • 정수 부분을 이진수로 변환정규화
  • 다음과 같은 방법으로 분수 부분을 변환합니다.
  • 두 결과를 더하여 적절한 최종 변환을 생성하도록 조정합니다.

소수 부분 변환: 12.375의 소수 부분인 0.375를 고려합니다.2진수로 변환하려면 분수에 2를 곱하고 정수 부분을 취하여 0의 분수가 발견될 때까지 또는 IEEE 754 binary32 형식의 경우 23분수인 정밀도 한계에 도달할 때까지 새로운 분수에 2를 반복합니다.

0 +b - { 0. 2 }= 정수 부분은 이진수 자릿수를 .계속하려면 0.750 x 2를 다시 곱하십시오.
× + b - \ 0.\ 2 + \ b { - 3= , fraction = 0.011 , terminate

0.375} 은 ( {로 정확하게 이진수로 나타낼 수 있습니다.모든 소수 분수를 유한 자리수의 이진수로 나타낼 수 있는 것은 아닙니다.예를 들어, 10진수 0.1은 정확히 2진수로 나타낼 수 없으며 근사치만 나타낼 수 있습니다.그 때문에,

IEEE 754 binary32 포맷에서는 ( 1 23) (실제 값을 나타낼 필요가 있습니다. 2 형식(정규화 번호, 비정규화 번호 참조), 1100.011은 오른쪽으로3 자리 이동하여 ( × 3 ( 2됩니다.

마지막으로알 수 (.375 (.2 × 2}\3}}입니다.

여기서 추리합니다.

  • 지수는 3입니다( 바이어스 형식에서는 130 130
  • 분수는 100011(바이너리 포인트 오른쪽 참조)입니다.

이들로부터 12.375의 32비트 IEEE 754 binary32 형식의 표현을 형성할 수 있습니다.

주의: 68.123을 IEEE 754 binary32 형식으로 변환하는 것을 검토해 주십시오.위의 절차를 사용하면 ( text{을 얻을 수 있습니다._마지막 4비트는 1001입니다.다만, IEEE 754 포맷의 디폴트 반올림 동작에 의해 ( displaystyletext{})이 표시됩니다.마지막 4비트는 1010입니다.

1: 소수점 1을 고려합니다. 수 있습니다 (1) (0 )× 2 { (1) { } = ( 0 )2} \ 2^ { }

여기서 추리합니다.

  • 지수는 0입니다( 바이어스 형식에서는 127 127
  • 분수는 0입니다(1.0에서 이진수 점의 오른쪽을 보면 0 ... 0 )

이들로부터, 32비트 IEEE 754 binary32 형식의 리얼 번호1 의 표현을 형성할 수 있습니다.

2: 값 0.25를 고려합니다.0 (0 × -2 ({25}=( 2임을 알 수 있습니다.

여기서 추리합니다.

  • 지수는 -2입니다(편향된 형식에서는(+(- ( 10 ( { {= (_ {2}
  • 분수는 0입니다(1.0의 바이너리 포인트 오른쪽은 모두 0).

이들로부터 32비트 IEEE 754 binary32 형식의 실수 0.25를 표현할 수 있습니다.

3: 0.375의 값을 고려합니다.0 ( (1 × - ({0.={(}}={( 2을 확인했습니다.

따라서 (1 × -({{(로 0.375의 표현을 결정한 후 위와 같이 진행할 수 있습니다.

  • 지수는 -2입니다(편향된 형식에서는(+(- ( 10 ( { {= (_ {2}
  • 분수는 1입니다(1.1에서 이진점 오른쪽은 1 1({ 1

이들로부터, 32비트 IEEE 754 binary32 형식의 리얼 번호 0.375 를 나타낼 수 있습니다.

binary32를 10진수로 변환하는 중

binary32 값이 있는 경우이 예에서는 41C80000이 16진수입니다.먼저 바이너리로 변환합니다.

그런 다음 부호 비트, 지수, 유의의 세 부분으로 나눕니다.

  • 비트:
  • 지수: 2 16 10{ 1000 \ { 2} 83 _ { 16 } = _ { }
  • 중요도: 2 16({ 스타일 \ 1000\{2}=

그런 다음 암묵적인 24번째 비트를 의미에 추가합니다.

  • 중요도: 2 16 \ {1}}= }}16

127을 빼서 지수 값을 디코딩합니다.

  • 원시 지수: 16 10 _ { } =_ { }
  • 디코딩된 지수: - {\ - 149 =}

significand(암묵적인 24번째 비트 포함)의 각 24비트(23번째 비트 포함)는 다음과 같이 각 비트의 1/2에서 시작하는 값을 나타냅니다.

비트 23 = 1 비트 22 = 0.5 비트 21 = 0.25 비트 20 = 0.125 비트 19 = 0.0625 비트 18 = 0.03125 . 비트 0 = 0.000011920928955078125

이 예의 significant 및 에는 비트 23, 비트 22 및 비트19의 3가지 비트가 설정되어 있습니다.이제 이러한 비트로 표시되는 값을 추가하여 의 의미를 디코딩할 수 있습니다.

  • 디코딩된 +.+ 0. 1. /2 ({ 1.5625}}/

그런 다음 기저값 2에 지수의 거듭제곱을 곱해야 최종 결과를 얻을 수 있습니다.

따라서

이는 다음과 같습니다.

여기서 s는 부호 비트, x는 지수, m은 유의값입니다.

10진수치에 대한 정밀도 제한(1~16777216)

  • 1과 2 사이의 소수점: 고정 간격−23 2(1+2는−23 1 다음으로 큰 부동)
  • 2와 4 사이의 소수점: 고정 간격−22 2
  • 4 ~ 8 의 소수점: 고정 간격−21 2
  • ...
  • 2와n+1 2 사이의n 소수점: 고정 간격n-23 2
  • ...
  • 2=4194304와 223=8388608 사이의22 소수점: 고정 간격−1 2=0.5
  • 2=8388608과 224=16777216 사이의23 소수점: 고정 간격0 2=1

정수값에 대한 정밀도 제한

  • 0 ~ 16777216 의 정수는 정확하게 나타낼 수 있습니다(-167777216 ~0 의 음의 정수에도 적용됩니다).
  • 2=16777216과 225=33554432 사이의24 정수는 2의 배수(짝수)로 반올림합니다.
  • 2와26 2 사이의25 정수는 4의 배수로 반올림합니다.
  • ...
  • 2와n+1 2 사이의n 정수는 2의n-23 배수에서 반올림합니다.
  • ...
  • 2와128 2 사이의127 정수는 2의104 배수에서 반올림합니다.
  • 2보다128 크거나 같은 정수는 "무한"으로 반올림됩니다.

주목할 만한 단정도 사례

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

0 0000000000000000000000000012 = 0000000116 = 2−126 × 2−23 = 2−149 ≈ 1.4012984643 × 10−45 (양수 이하)
0 000000 11111111111111111111111112 = 007f ffff16−126 = 2 × (1−23 - 2) 1 1.1754942107−38 × 10 (최대 미정규수)
0 00000001 00000000000000000002 = 008016 0000−126 = 2 ≈ 1.1754943508 × 10−38 (정수)
0 111111111111111111111111111112 = 7f7f ffff16127 = 2 × (2−23 - 2) ≈ 3.4028234664 × 1038 (통상 최대수)
01111110 11111111111111111112 = 3f7f fff16 = 1 - 2−24 ≈ 0.9999940395225 (가장 큰 수는 1 미만)
011111 0000000000000000000002 = 3f80 000016 = 1 ( 1 )
011111 000000000000000012 = 3f80 000116 = 1 + 2−23 1 1.000011920928955 (1보다 큰 번호)
110000000 000000000000000000000002)c000 000016)−2 000000000 000000000000000000000002=0000000016=0100000000 000000000000000000000002=8000000016)−0 011111111 000000000000000000000002=7f80 000016)무한대 111111111 000000000000000000000002)ff80 000016)−infinity.                            010000000100100100001111110110112=4049 0fdb16 ≈ 3.14159274101257324≈ π(파이)001111101 010101010101010101010112=3eaa aaab16 ≈ 0.333333343267440796 ≈ 1/3x11111111 100000000000000000000012)ffc0 000116)qNaN(x86과 ARM프로세서에)x11111111 000000000000000000000012)ff80 000116)sNaN(에 x86과 ARM. processors)

디폴트로는 1/3은 반올림합니다.이는 유의한 비트 수가 짝수이기 때문에 2배의 정밀도로 다운되는 것이 아니라 반올림됩니다.반올림점 너머의 1/3 비트는1010...이것은 꼴찌의 1/2 단위보다 큽니다.

qNaN 및 sNaN의 인코딩은 IEEE 754에서 규정되어 있지 않으며 프로세서마다 다르게 구현되어 있습니다.x86 패밀리 및 ARM 패밀리 프로세서는 significantand 필드의 최상위 비트를 사용하여 조용한 NaN을 나타냅니다.PA-RISC 프로세서는 비트를 사용하여 시그널링 NaN을 나타냅니다.

최적화

부동소수점 형식의 설계는 다양한 최적화를 가능하게 하며, 원시 비트 패턴의 정수 뷰에서 Base-2 로그 근사치를 쉽게 생성하기 때문이다.정수 산술과 비트 시프트는 일반적으로 컴퓨터 그래픽스에서 필요역제곱근(고속 역제곱근)에 대한 근사치를 산출할 수 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "REAL Statement". scc.ustc.edu.cn. Archived from the original on 2021-02-24. Retrieved 2013-02-28.
  2. ^ "CLHS: Type SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT..."
  3. ^ "Primitive Data Types". Java Documentation.
  4. ^ "6 Predefined Types and Classes". haskell.org. 20 July 2010.
  5. ^ "Float". Apple Developer Documentation.
  6. ^ William Kahan (1 October 1997). "Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic" (PDF). p. 4.

외부 링크