Jump to content

Decimal floating point

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning

십진 부동-점(Decimal floating-point, 줄여서 DFP) 산술은 십진(decimal) 부동-점(floating-point) 숫자에 대한 표현과 연산을 모두 참조합니다. 십진수 (밑수-10) 분수를 직접 연산하는 것은 그렇지 않으면 (측정 또는 재무 정보와 같은, 사람이 입력한 데이터에서 공통적인) 십진 분수와 이진 (밑수-2) 분수 사이에서 변환할 때 전형적으로 발생하는 반올림 오차를 피할 수 있습니다.

십진 고정-점(fixed-point)정수(integer) 표현보다 십진 부동-점 표현의 장점은 그것이 값의 더 넓은 범위를 지원한다는 것입니다. 예를 들어, 8 십진 자릿수와 2 십진 자리를 할당하는 고정-점 표현은 123456.78, 8765.43, 123.00, 등의 숫자를 나타낼 수 있는 반면 8 십진 자릿수를 갖는 부동-점 표현은 역시 1.2345678, 1234567.8, 0.000012345678, 12345678000000000, 등을 나타낼 수 있습니다. 이러한 더 넓은 범위는 연속적인 계산 동안 반올림 오차의 축적을 극적으로 느리게 할 수 있습니다; 예를 들어, 카한 합산 알고리듬(Kahan summation algorithm)은 반올림 오차의 점근적 축적없이 많은 숫자를 더하기 위해 부동 점에서 사용될 수 있습니다.

Implementations

십진법 부동 점의 초기 기계적 사용은 주판(abacus), 미끄럼 자(slide rule), Smallwood 계산기, 및 과학 표기법(scientific notation)에서 엔트리를 지원하는 다른 계산기(calculators)에서 분명히 나타납니다. 기계적 계산기의 경우에서, 지수는 종종 별도로 설명되는 부가 정보로 취급됩니다.

IBM 650 컴퓨터는 1953년에 8-자릿수 십진 부동-점 형식을 지원했습니다.[1] 그렇지 않으면 이진 Wang VS 기계는 1977년에 64-비트 십진 부동-점 형식을 지원했습니다.[2] Motorola 68040 프로세서에 대해 부동-점 지원 라이브러리는 1990년에 96-비트 십진 부동-점 저장 형식을 제공했습니다.[2]

일부 컴퓨터 언어(computer languages)PL/I, C#, 큰 10진수를 갖는 Java, calc를 갖는 emacs, 및 Python의 십진 모듈을 포함하여 십진 부동-점 산술 구현해 왔습니다. 1987년에, IEEE는 다른 시스템과의 교환을 위해 부동-점 데이터를 인코딩하는 방법에 대한 사양이 없는 십진 부동-점 계산을 위한 표준, IEEE 854를 발표했습니다. 이것은 IEEE 754-2008에서 해결되었으며, 이는 십진 부동-점 데이터의 인코딩을 표준화했지만 두 가지 다른 방법을 사용했습니다.

IBM POWER6와 더 최근 POWER 프로세서는 IBM System z9[3] (및 이후 zSeries 기계)와 마찬가지로 하드웨어에 DFP를 포함하고 있습니다. SilMinds는 구성 가능한 벡터 DFP 코프로세서(coprocessor), SilAx를 제공합니다.[4] IEEE 754-2008은 이것을 더 자세히 정의합니다. Fujitsu는 역시 하드웨어에 DFP를 갖는 64-비트 Sparc 프로세서를 가지고 있습니다.[5]

Microsoft C#, 또는 .NET은 System.Decimal을 사용합니다.[6]

IEEE 754-2008 encoding

IEEE 754-2008 표준은 32-비트, 64-비트, 및 128-비트 십진 부동-점 표현을 정의합니다. 이진 부동-점 형식과 마찬가지로, 숫자는 부호, 지수, 및 유효숫자(significand)로 나뉩니다. 이진 부동-점과 달리, 숫자가 반드시 정규화되는 것은 아닙니다; 적은 유효 자릿수(significant digits)를 갖는 값은 1×102=0.1×103=0.01×104, 등 여러 가지 가능한 표현을 가집니다. 유효숫자가 영일 때, 지수는 아무 값이나 될 수 있습니다.

IEEE 754-2008 decimal floating-point formats
decimal32 decimal64 decimal128 decimal(32k) Format
1 1 1 1 Sign field (bits)
5 5 5 5 Combination field (bits)
6 8 12 w = 2×k + 4 Exponent continuation field (bits)
20 50 110 t = 30×k−10 Coefficient continuation field (bits)
32 64 128 32×k Total size (bits)
7 16 34 p = 3×t/10+1 = 9×k−2 Coefficient size (decimal digits)
192 768 12288 3×2w = 48×4k Exponent range
96 384 6144 Emax = 3×2w−1 Largest value is 9.99...×10Emax
−95 −383 −6143 Emin = 1−Emax Smallest normalized value is 1.00...×10Emin
−101 −398 −6176 Etiny = 2−p−Emax Smallest non-zero value is 1×10Etiny

지수 범위는 정규화된 값에 사용할 수 있는 범위가 근사적으로 대칭적이 되도록 선택되었습니다. 이것은 가능한 지수 값의 짝수와 함께 정확하게 수행될 수 없기 때문에, 여분의 값이 Emax에 주어졌습니다.

두 가지 다른 표현이 정의됩니다:

  • 이진 정수 유효숫자 필드를 갖는 것은 유효숫자를 0과 10p−1 사이의 큰 이진 정수로 인코딩합니다. 이것은 이진 ALU를 사용하는 소프트웨어 구현에 더 편리할 것으로 예상됩니다.
  • 조밀하게 포장된 십진 유효숫자 필드를 갖는 또 다른 것은 십진 자릿수를 보다 직접적으로 인코딩합니다. 이것은 이진 부동-점 형식으로부터 및 으로의 변환을 더 빠르게 만들지만, 효율적으로 조작하기 위해 특수 하드웨어를 요구합니다. 이것은 하드웨어 구현에 더 편리할 것으로 예상됩니다.

두 대안 모두 정확히 같은 범위의 표현 가능한 값을 제공합니다.

지수의 최상위 유효 2 비트는 0−2의 범위로 제한되고, 유효숫자의 최상위 유효 4 비트는 0−9의 범위로 제한됩니다. 30가지 가능한 조합은 무한대 및 NaN에 대한 특수 형식과 함께 5-비트 필드에 인코딩됩니다.

유효 숫자의 최상위 유효 4 비트가 0과 7 사이이면, 인코딩된 값은 다음과 같이 시작합니다:

s 00mmm xxx   Exponent begins with 00, significand with 0mmm
s 01mmm xxx   Exponent begins with 01, significand with 0mmm
s 10mmm xxx   Exponent begins with 10, significand with 0mmm

유효숫자의 선행 4 비트가 이진수 1000 또는 1001 (십진수 8 또는 9)이면, 그 숫자는 다음과 같이 시작합니다:

s 1100m xxx   Exponent begins with 00, significand with 100m
s 1101m xxx   Exponent begins with 01, significand with 100m
s 1110m xxx   Exponent begins with 10, significand with 100m

선행 비트 (위에서 s)는 부호 비트이고, 다음 비트들 (위에서 xxx)는 추가 지수 비트와 최상위 유효 자릿수의 나머지를 인코딩하지만, 세부 사항은 사용된 인코딩 대안에 따라 다릅니다.

최종 조합은 무한대 및 NaN에 사용되고, 두 가지 대안 인코딩 모두에 대해 같습니다:

s 11110 x   ±Infinity (see Extended real number line)
s 11111 0   quiet NaN (sign bit ignored)
s 11111 1   signaling NaN (sign bit ignored)

후자의 경우에서, 인코딩의 모든 다른 비트는 무시됩니다. 따라서, 배열을 단일 바이트 값을 갖는 그것을 채움으로써 NaN으로 초기화하는 것이 가능합니다.

Binary integer significand field

이 형식은 0에서 10p−1까지의 이진 유효숫자를 사용합니다. 예를 들어, Decimal32 유효숫자는 최대 107−1 = 9999999 = 98967F16 = 가 될 수 있습니다. 인코딩이 더 큰 유효 숫자를 나타낼 수 있지만, 그것들은 불법이고 표준은 입력에서 발생되면 그것들을 0으로 처리하기 위해 구현을 요구합니다.

위에서 설명된 것처럼, 유효숫자의 최상위 유효 4 비트가 0에서 7 (00002에서 01112), 또는 그 이상 (10002 또는 10012) 범위에 있는지 여부에 따라 인코딩이 달라집니다.

부호 비트 뒤의 2 비트가 "00", "01", 또는 "10"이면, 지수 필드는 부호 비트 뒤의 8 비트 (언급된 2비트 더하기 "지수 연속 필드"의 6비트)로 구성되고, 유효숫자는 남아있는 23비트이며, 여기에 괄호 안에 표시된 암시적 선행 0비트가 있습니다:

 s 00eeeeee   (0)ttt tttttttttt tttttttttt
 s 01eeeeee   (0)ttt tttttttttt tttttttttt
 s 10eeeeee   (0)ttt tttttttttt tttttttttt

이것은 선행 유효수자 자릿수가 0인 비정규 숫자(subnormal numbers)를 포함합니다.

부호 비트 뒤의 2 비트가 "11"이면, 8-비트 지수 필드가 오른쪽으로 2 비트 이동하고 (부호 비트와 그 뒤에 "11" 비트 후), 표시된 유효숫자는 남아있는 21 비트에 있습니다. 이 경우에서, 실제 유효숫자에 암시적 (즉, 저장되지 않는) 선행 3-비트 수열 "100"가 있습니다:

 s 1100eeeeee (100)t tttttttttt tttttttttt
 s 1101eeeeee (100)t tttttttttt tttttttttt
 s 1110eeeeee (100)t tttttttttt tttttttttt

부호 비트 뒤의 "11" 2-비트 수열이 유효숫자에 대한 암시적 "100" 3-비트 접두사가 있음을 나타냅니다.

유효숫자 필드의 선행 비트는 최상위 유효 십진 자릿수를 인코딩하지 않음에 주목하십시오; 그것들은 단순히 더 큰 순수-이진수의 일부입니다. 예를 들어, 유효숫자 8000000은 이진수 011110100001001000000000으로 인코딩되며, 선행 4비트는 7을 인코딩합니다; 24번째 비트 (및 따라서 두 번째 인코딩 형식)를 요구하는 첫 번째 유효숫자는 223 = 8388608입니다.

위의 경우에서, 표현된 값은 다음입니다:

(−1)sign × 10exponent−101 × significand

Decimal64 및 Decimal128는 유사하게 작동하지만, 더 큰 지수 연속과 유효숫자 필드를 가집니다. Decimal128에 대해, 두 번째 인코딩 형식은 실제로 결코 사용되지 않습니다; 1034−1 = 1ED09BEAD87C0378D8E63FFFFFFFF16의 가장 큰 유효한 유효숫자는 113 비트로 나타낼 수 있습니다.

Densely packed decimal significand field

이 버전에서, 유효숫자는 십진 자릿수의 수열로 저장됩니다. 선행 자릿수는 0과 9 (3 또는 4 이진 비트)이고, 유효숫자의 나머지 부분은 조밀하게 포장된 십진수(densely packed decimal, 줄여서 DPD) 인코딩을 사용합니다.

지수의 선행 2비트와 유효숫자의 선행 자릿수 (3 또는 4비트)는 부호 비트 다음에 오는 다섯 비트로 결합됩니다. 그 뒤에 고정된-오프셋 지수 연속 필드가 옵니다.

마지막으로, 유효숫자 연속 필드는 2, 5, 또는 11개의 10-비트 declet으로 구성되며, 각각은 3 십진 자릿수를 인코딩합니다.[7]

부호 비트 뒤의 처음 두 비트가 "00", "01", 또는 "10"이면, 그것들은 지수의 선행 비트이고, 그 뒤의 세 비트는 선행 십진 자릿수 (0에서 7)로 해석됩니다:[8]

    Comb.  Exponent          Significand
 s 00 TTT (00)eeeeee (0TTT)[tttttttttt][tttttttttt]
 s 01 TTT (01)eeeeee (0TTT)[tttttttttt][tttttttttt]
 s 10 TTT (10)eeeeee (0TTT)[tttttttttt][tttttttttt]

부호 비트 뒤의 처음 두 비트가 "11"이면, 두 번째 두 비트는 지수의 선행 비트이고, 마지막 비트는 선행 십진 자릿수 (8 또는 9)를 형성하기 위해 "100" 접두사가 붙습니다:

    Comb.  Exponent          Significand
 s 1100 T (00)eeeeee (100T)[tttttttttt][tttttttttt]
 s 1101 T (01)eeeeee (100T)[tttttttttt][tttttttttt]
 s 1110 T (10)eeeeee (100T)[tttttttttt][tttttttttt]

5-비트 필드의 남아있는 두 조합 (11110과 11111)은 각각 ±infinity 및 NaN을 나타내기 위해 사용됩니다.

Floating-point arithmetic operations

부동-점 연산을 수행하는 보통 규칙은 정확한 수학적 값이 계산되고,[9] 그 결과가 그런-다음 지정된 정밀도에서 가장 가까운 표현 가능한 값으로 반올림된다는 것입니다. 이것은 사실 정상적인 반올림 동작과 예외적인 조건의 부재에서 IEEE-호환 컴퓨터 하드웨어에 요구되는 동작입니다.

표현과 이해의 편의를 위해, 7-자리 정밀도가 예제에서 사용될 것입니다. 근본 원칙은 임의의 정밀도에서 같습니다.

Addition

부동-점 숫자를 더하기 위한 간단한 방법은 먼저 같은 지수로 표현하는 것입니다. 아래 예에서, 두 번째 숫자는 3 자릿수 오른쪽으로 이동됩니다. 보통의 덧셈 방법으로 진행합니다:

다음 예는 10진수로, 단순히 밑수가 10임을 의미합니다.

  123456.7 = 1.234567 × 105
  101.7654 = 1.017654 × 102 = 0.001017654 × 105

따라서:

  123456.7 + 101.7654 = (1.234567 × 105) + (1.017654 × 102)
                      = (1.234567 × 105) + (0.001017654 × 105)
                      = 105 × (1.234567 + 0.001017654)
                      = 105 × 1.235584654

이것은 과학적 표기법(scientific notation)으로 변환하는 것 외에 다른 것이 아닙니다. 자세하게:

  e=5;  s=1.234567     (123456.7)
+ e=2;  s=1.017654     (101.7654)
  e=5;  s=1.234567
+ e=5;  s=0.001017654  (after shifting)
--------------------
  e=5;  s=1.235584654  (true sum: 123558.4654)

이것이 피연산자의 정확한 합계, 참 결과입니다. 그것은 7 자릿수로 반올림하고 그런-다음 필요하면 정규화됩니다. 최종 결과는 다음과 같습니다:

  e=5;  s=1.235585    (final sum: 123558.5)

두 번째 피연산자 (654)의 하위 3 자릿수는 필연적으로 손실됨을 주목하십시오. 이것이 반올림 오류(round-off error)입니다. 극단적인 경우에서, 두 개의 비-영 숫자의 합은 다음 중 하나와 같을 수 있습니다:

  e=5;  s=1.234567
+ e=−3; s=9.876543
  e=5;  s=1.234567
+ e=5;  s=0.00000009876543 (after shifting)
----------------------
  e=5;  s=1.23456709876543 (true sum)
  e=5;  s=1.234567         (after rounding/normalization)

유효숫자의 손실의 또 다른 문제는 거의 같은 두 수에 대한 근삿값을 뺄 때 발생합니다. 다음 예에서, e = 5; s = 1.234571 및 e = 5; s = 1.234567은 유리수 123457.1467 및 123456.659에 대한 근삿값입니다.

  e=5;  s=1.234571
− e=5;  s=1.234567
----------------
  e=5;  s=0.000004
  e=−1; s=4.000000 (after rounding and normalization)

부동-점 차이는 그 숫자들이 가깝기 때문에 정확하게 계산됩니다—스테벤츠 보조 정리(Sterbenz lemma)가 이것을 보장하며, 심지어 점진적 언더플로(gradual underflow)가 지원될 때 언더플로의 경우에도 보장합니다. 이것에도 불구하고, 원래 숫자의 차이는 e = −1; s = 4.877000이며, 근삿값의 차이 e = −1; s = 4.000000와 20% 이상 다릅니다. 극단적인 경우에서, 모든 유효 자릿수의 정밀도가 손실될 수 있습니다.[10][11] 이러한 취소(cancellation)는 계산된 결과의 모든 자릿수가 의미가 있다고 가정할 때의 위험성을 묘사합니다. 이들 오류의 결과를 처리하는 것은 수치 해석학(numerical analysis)의 주제입니다; 역시 정확도 문제(Accuracy problems)를 참조하십시오.

Multiplication

곱하기 위해, 유효숫자가 곱해지고, 지수가 더해지고, 그 결과가 반올림되고 정규화됩니다.

  e=3;  s=4.734612
× e=5;  s=5.417242
-----------------------
  e=8;  s=25.648538980104 (true product)
  e=8;  s=25.64854        (after rounding)
  e=9;  s=2.564854        (after normalization)

나눗셈도 비슷하지만, 더 복잡합니다.

곱셈이나 나눗셈에는 취소 또는 흡수 문제가 없지만, 연산이 반복적으로 수행될 때 작은 오차가 누적될 수 있습니다. 실제로, 이들 연산이 디지털 논리에서 수행되는 방식은 상당히 복잡할 수 있습니다.

See also

References

  1. ^ Beebe, Nelson H. F. (2017-08-22). "Chapter H. Historical floating-point architectures". The Mathematical-Function Computation Handbook - Programming Using the MathCW Portable Software Library (1 ed.). Salt Lake City, UT, USA: Springer International Publishing AG. p. 948. doi:10.1007/978-3-319-64110-2. ISBN 978-3-319-64109-6. LCCN 2017947446.
  2. ^ a b Savard, John J. G. (2018) [2007]. "The Decimal Floating-Point Standard". quadibloc. Archived from the original on 2018-07-03. Retrieved 2018-07-16.
  3. ^ "IBM z9 EC and z9 BC — Delivering greater value for everyone" (PDF). 306.ibm.com. Retrieved 7 July 2018.
  4. ^ "Arithmetic IPs for Financial Applications - SilMinds". Silminds.com.
  5. ^ "Chapter 4. Data Formats". Sparc64 X/X+ Specification. Nakahara-ku, Kawasaki, Japan. January 2015. p. 13.{{cite book}}: CS1 maint: location missing publisher (link)
  6. ^ "Decimal floating point in .NET". Yoda.arachsys.com.
  7. ^ Muller, Jean-Michel; Brisebarre, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Stehlé, Damien; Torres, Serge (2010). Handbook of Floating-Point Arithmetic (1 ed.). Birkhäuser. doi:10.1007/978-0-8176-4705-6. ISBN 978-0-8176-4704-9. LCCN 2009939668.
  8. ^ Decimal Encoding Specification, version 1.00, from IBM
  9. ^ Computer hardware doesn't necessarily compute the exact value; it simply has to produce the equivalent rounded result as though it had computed the infinitely precise result.
  10. ^ Goldberg, David (March 1991). "What Every Computer Scientist Should Know About Floating-Point Arithmetic" (PDF). ACM Computing Surveys. 23 (1): 5–48. doi:10.1145/103162.103163. S2CID 222008826. Retrieved 2016-01-20. ([1], [2], [3])
  11. ^ Template:US patent reference

Further reading