소수점 부동 소수점
Decimal floating point부동 소수점 포맷 |
---|
IEEE 754 |
다른. |
컴퓨터 아키텍처 비트 폭 |
---|
조금 |
어플 |
이진 부동 소수점 정확 |
소수점 부동 소수점 정확 |
Decimal Floating Point(DFP; 10진 부동 소수점) 산술은 표현과 10진 부동 소수점 숫자에 대한 연산을 모두 나타냅니다.소수(기준 10) 분수를 직접 작업하면 소수(측정 또는 재무 정보 등 인간이 입력한 데이터에서 공통)와 이진수(기준 2) 분수를 변환할 때 일반적으로 발생하는 반올림 오류를 방지할 수 있다.
10진수 부동소수점 표현은 10진수 고정소수점 표현 및 정수 표현보다 훨씬 넓은 범위의 값을 지원한다는 장점이 있습니다.예를 들어, 소수점 8자리 및 소수점 2자리를 할당하는 고정 소수점 표현은 123456.78, 8765.43, 123.00 등의 숫자를 나타낼 수 있지만, 소수점 8자리 부동 소수점 표현은 1.2345678, 1234567.8, 0.000045678, 1234567000000000000000 등을 나타낼 수도 있습니다.이 넓은 범위는 연속 계산 중에 반올림 오차의 축적을 극적으로 늦출 수 있습니다.예를 들어, Kahan 가산 알고리즘을 부동 소수점 내에서 사용하면 반올림 오차의 점근적 축적이 없는 다수의 숫자를 추가할 수 있습니다.
실장
주판, 슬라이드 규칙, Smallwood 계산기 및 과학적 표기법 입력을 지원하는 다른 계산기에서 십진 부동 소수점의 초기 기계적 용도가 명백합니다.기계 계산기의 경우, 지수는 종종 별도로 설명되는 측면 정보로 취급된다.
IBM 650 컴퓨터는 1953년에 [1]8자리 10진 부동 소수점 형식을 지원했습니다.그렇지 않으면 바이너리 Wang VS 머신은 [2]1977년에 64비트 10진 부동소수점 형식을 지원했습니다.Motorola 68040 프로세서의 부동소수점 지원 라이브러리는 [2]1990년에 96비트 10진수 부동소수점 스토리지 포맷을 제공했습니다.
PL/I, C#, 자바(큰 소수점), emacs(계산), 파이썬(Python)의 10진수 모듈을 포함한 일부 컴퓨터 언어에는 10진수 부동소수점 산술이 구현되어 있습니다.1987년 IEEE는 10진 부동소수점 연산 표준인 IEEE 854를 발표했습니다.이 규격에는 부동소수점 데이터를 다른 시스템과의 교환을 위해 부호화하는 방법에 대한 규격이 없었습니다.이는 이후 IEEE 754-2008에서 다루어졌습니다.이것은 10진 부동소수점 데이터의 부호화를 표준화한 것입니다.다만, 2개의 다른 대체 방법을 사용하고 있습니다.
IBM POWER6 및 최신 POWER 프로세서는 IBM System z9[3](및 이후 zSeries 시스템)와 마찬가지로 하드웨어에 DFP를 포함합니다.SilMinds는 벡터 DFP [4]코프로세서인 SilAx를 제공합니다.IEEE 754-2008 에서는, 이것을 보다 상세하게 정의하고 있습니다.후지쯔는 [5][2]하드웨어에 DFP를 탑재한 64비트 Sparc 프로세서도 탑재하고 있습니다.
Microsoft C# 또는NET, 시스템을 사용합니다.십진법[6]
IEEE 754-2008 부호화
IEEE 754-2008 표준에서는 32비트, 64비트 및 128비트의 10진 부동소수점 표현을 정의하고 있습니다.이진 부동소수점 형식과 마찬가지로 숫자는 기호, 지수 및 유의값으로 나뉩니다.이진 부동 소수점과는 달리, 숫자는 반드시 정규화되지 않습니다. 유효 자릿수가 적은 값은 1×102=0으로 여러 번 표현될 수 있습니다.1×103=0.01×104 등유의와 값이 0일 경우 지수는 모든 값이 될 수 있습니다.
10진수 32 | 십진수 64 | 십진수128 | 10진수(32k) | 포맷 |
---|---|---|---|---|
1 | 1 | 1 | 1 | 부호 필드(비트) |
5 | 5 | 5 | 5 | 조합 필드(비트) |
6 | 8 | 12 | w = 2×k + 4 | 지수 연속 필드(비트) |
20 | 50 | 110 | t = 30×k-10 | 계수 연속 필드(비트) |
32 | 64 | 128 | 32×k | 총 크기(비트) |
7 | 16 | 34 | p = 3×t/10+1 = 9×k-2 | 계수 크기(10진수) |
192 | 768 | 12288 | 3×2w = 48×4k | 지수 범위 |
96 | 384 | 6144 | Emax = 3×2w−1 | 최대값은 9.99...×10Emax |
−95 | −383 | −6143 | 에민 = 1-Emax | 최소 정규화 값은 1.00...×10Emin |
−101 | −398 | −6176 | 에티니 = 2-p-Emax | 0이 아닌 최소값은 1×10입니다Etiny. |
지수 범위는 정규화된 값에 사용할 수 있는 범위가 거의 대칭이 되도록 선택되었다.이는 가능한 지수 값의 짝수로 정확하게 수행할 수 없기 때문에 추가 값이 Emax에 주어졌습니다.
두 가지 다른 표현이 정의됩니다.
- 2진수 정수 significant 필드를 가진 1은 0에서 10-1p 사이의 큰 2진수 정수로 significant 및 를 인코딩합니다.이는 바이너리 ALU를 사용하는 소프트웨어 구현에 더 편리할 것으로 예상됩니다.
- 촘촘하게 패킹된 10진수 유의 및 필드가 있는 다른 항목은 10진수를 더 직접적으로 인코딩합니다.이를 통해 바이너리 부동소수점 형식과의 변환이 빨라지지만 효율적으로 조작하려면 전용 하드웨어가 필요합니다.이 방법은 하드웨어 구현에 더 편리할 것으로 예상됩니다.
두 가지 대안 모두 정확하게 동일한 범위의 대표 값을 제공합니다.
지수의 최상위 2비트는 0-2 범위로 제한되며 최상위 4비트는 0-9 범위로 제한됩니다.30개의 가능한 조합은 5비트필드에 부호화되어 있으며, 그 밖에도 무한 및 NaN의 특수한 형식이 포함되어 있습니다.
의 최상위 4비트가 0 ~7 의 경우 부호화 값은 다음과 같이 시작됩니다.
s 00mm xxx 지수는 00으로 시작하고, 유의 0mm s 01mm xxx 지수는 01로 시작하고, 유의 0mm s 10mm xxx 지수는 10으로 시작하고, 유의 0mm로 시작합니다.
의 선두 4비트가 바이너리1000 또는 1001(10진수8 또는 9)일 경우 숫자는 다음과 같이 시작됩니다.
s 1100m xxx지수는 00으로 시작하고, 100m s 1101m xxx지수는 01로 시작하며, 100m s 1110m xx지수는 10으로 시작하고, 100m로 시작합니다.
선두 비트(위의 s)는 부호 비트입니다.다음 비트(위의 xxx)는 추가 지수 비트와 최상위 자리수의 나머지를 부호화합니다.다만, 상세한 것에 대하여는, 사용하는 부호화에 의해서 다릅니다.
최종 조합은 인피니티와 NaN에 사용되며 다음 두 가지 대체 인코딩에 대해 동일합니다.
s 11110 x ± Infinity(확장실수행 참조)의 11111 0 Quiet NaN(사인비트 무시)의 11111 1 시그널링 NaN(사인비트 무시)
후자의 경우 부호화의 다른 모든 비트는 무시됩니다.따라서 배열을 1바이트 값으로 채우는 것으로 NaN으로 초기화할 수 있습니다.
이진 정수 유의 필드
이 형식에서는 0 ~10-1p 의 이진수를 사용합니다.예를 들어, Decimal32 significant 및 최대 10-17 = 99999 = 98967F16 = 10011000100100011111입니다2.부호화는 더 큰 중요도를 나타낼 수 있지만, 그것들은 불법이며, 표준에서는 입력 시 이들을 0으로 취급할 필요가 있습니다.
위에서 설명한 바와 같이 부호화는 의 최상위4비트가 0 ~7(00002 ~01112) 또는 그 이상(1000 또는 10012)인지2 여부에 따라 달라집니다.
부호 비트 뒤의 2비트가 "00", "01" 또는 "10"인 경우, 지수 필드는 부호 비트 뒤의 8비트(상기된 2비트와 "exponent continuation field"의 6비트)로 구성되며, 유의어는 아래 괄호 안에 암묵적인 선두 0비트가 있는 나머지 23비트입니다.
s 00eeee (0)ttttttttttts 01eee (0)ttttttttttttttttttttttttttttttttttttttttt 10eeeeee (0)ttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
여기에는 선행 유효 자릿수가 0인 정규 이하의 숫자가 포함됩니다.
부호 비트 뒤의 2비트가 "11"인 경우, 8비트 지수 필드는 오른쪽으로 2비트 이동하며(그 후 부호 비트와 "11" 비트 모두 뒤), 표시된 유의는 나머지 21비트에 있습니다.이 경우 true significant에는 암묵적인(즉, 저장되지 않은) 선두의 3비트시퀀스 '100'이 존재합니다.
s 1100eeee (100) tttttttttt s 1101eeeee (100) ttttttttttttttt 1110eeeee (100) tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
부호 비트 뒤에 오는 "11" 2비트 시퀀스는 의미자에 대한 암묵적인 "100" 3비트 프리픽스가 있음을 나타냅니다.
significate 및 필드의 선두 비트는 최상위 10진수를 인코딩하지 않습니다.이 비트는 단순히 큰 순수 2진수의 일부일 뿐입니다.예를 들어, 8000000의 significant는 binary 011110100100000000000으로 인코딩되며 선두 4비트는 7로 인코딩됩니다.첫 번째 significant는 24번째 비트(따라서 두 번째 인코딩 형식)가 필요한23 경우 2 = 8388608입니다.
위의 경우 표시되는 값은 다음과 같습니다.
- (-1)sign × 10exponent−101 × 유의
Decimal64 및 Decimal128은 유사하게 동작하지만 지수 연속과 유의 필드가 더 큽니다.Decimal128의 경우 두 번째 인코딩 형식은 실제로 사용되지 않습니다.유효한 최대값은 10-134 = 1ED09BEAD87C0378D8E63입니다.FFFFF는16 113비트로 나타낼 수 있습니다.
촘촘하게 채워진 10진수 유의 및 필드
이 버전에서는 significant 및 는 일련의 10진수로 저장됩니다.선두 자리수는 0 ~9(3 또는4 바이너리비트)이며, 나머지 자리수는 Density Packed 10진수(DPD) 부호화를 사용합니다.
지수의 선두 2비트와 의 선두 자리(3 또는 4비트)가 부호 비트에 이은 5비트로 결합됩니다.그 뒤에 고정 오프셋 지수 연속 필드가 계속됩니다.
마지막으로 2비트, 5비트 또는 11비트 10진수로 이루어진 significant 및 continuation 필드.각각 3자리 10진수를 [7]부호화합니다.
부호 비트 뒤의 처음 2비트가 "00", "01" 또는 "10"인 경우, 이러한 비트는 지수의 선두 비트이며, 그 뒤의 3비트는 선두 10진수(0 ~ 7)[8]로 해석됩니다.
빗.지수 중요도 및 s 00 TTT (00) eee (0TT) [ tttttttt][ tttttt ]의 01 TTT (01) eee (0TT) [ tttttttt]S 10 TTT ( 10 ) eee ( 0TTT)
부호 비트 뒤의 처음 2비트가 "11"인 경우, 두 번째 2비트는 지수의 선두 비트이고 마지막 비트에는 "100"이 접두되어 선두 10진수(8 또는 9)를 형성합니다.
빗.지수 중요도 및 s 1100 T (00) eee (100T) [ttttttt][ttttttt] s 1101 T (01) eee (100T) [ttttttt] s 1110 T (10) eeee (100T) [ttttttttt]
5비트 필드의 나머지 두 가지 조합(11110 및 11111)은 각각 ±infinity 및 NaN을 나타내기 위해 사용됩니다.
부동 소수점 연산
부동소수점 산술 수행의 일반적인 규칙은 정확한 수학적 [9]값이 계산되고 그 결과가 지정된 정밀도로 가장 가까운 대표 가능한 값으로 반올림되는 것입니다.이것은, 통상의 반올림 동작과 예외적인 조건이 없는 경우, IEEE 준거의 컴퓨터 하드웨어에 대해서 요구되는 동작입니다.
프레젠테이션과 이해를 용이하게 하기 위해 예에서는 7자리 정밀도를 사용합니다.기본 원칙은 어떤 정밀도에서도 동일하다.
추가
부동소수점 수를 추가하는 간단한 방법은 먼저 같은 지수로 부동소수점 수를 표현하는 것입니다.다음 예제에서는 두 번째 숫자가 3자리 오른쪽으로 이동합니다.일반적인 추가 방법으로 진행합니다.
다음 예시는 10진수입니다.이것은 단순히 밑수가 10임을 의미합니다.
123456.7 = 1.234567 × 1015.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.2354654654
이것은 과학적 표기법으로 변환하는 것에 지나지 않는다.상세:
e=5; s=1.234567(123456.7) + e=2; s=1.017654(101.7654)
e=5; s=1.234567 + e=5; s=0.001017654(이동 후), e=5; s=1.235584654(참합: 123558.4654)
이것이 피연산자의 정확한 합인 진정한 결과입니다.이 값은 7자리로 반올림된 후 필요에 따라 정규화됩니다.최종 결과는 다음과 같습니다.
e=5; s=1.235585 (최종 합계: 123558.5)
두 번째 피연산자(654)의 하위 3자리는 기본적으로 손실됩니다.이것은 반올림 에러입니다.극단적인 경우에는 0이 아닌 두 숫자의 합계가 다음 중 하나와 같을 수 있습니다.
e=5; s=1.234567 + e=-3; s=9.876543
e=5; s=1.234567 + e=5; s=0.00000009876543(이동 후) ----------------------------- e=5; s=1.23456709876543(참합) e=5; s=1.234567(반올림/정규화 후)
유의성 손실의 또 다른 문제는 거의 동일한 두 숫자에 대한 근사치를 뺄 때 발생합니다.다음 예제에서는 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(반올림 및 정규화 후)
부동소수점 차이는 숫자가 가깝기 때문에 정확하게 계산됩니다.Sterbenz lema는 점진적인 언더플로우가 지원되는 언더플로우인 경우에도 이를 보증합니다.그럼에도 불구하고 원래 숫자의 차이는 e = -1; s = 4.877000으로, e = -1; s = 4.0000의 근사치와 20% 이상 차이가 납니다.극단적인 경우에는 모든 유효 자릿수의 [10][11]정밀도가 손실될 수 있습니다.이 취소는 계산된 결과의 모든 자릿수가 의미가 있다고 가정할 때의 위험을 나타냅니다.이러한 오류의 결과에 대한 대처는 수치 분석의 주제입니다. 정확도 문제도 참조하십시오.
곱셈
곱하기 위해 유의점을 곱하고 지수를 더하면 결과는 반올림되고 정규화됩니다.
e=3; s=4.734612 × e=5; s=5.417242 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
나눗셈도 비슷하지만 더 복잡하다.
반복하여 작업을 수행함에 따라 작은 오차가 누적될 수 있지만 곱셈이나 나눗셈에 따른 취소 또는 흡수 문제는 없습니다.실제로 디지털 로직에서 이러한 작업이 수행되는 방법은 매우 복잡할 수 있습니다.
「 」를 참조해 주세요.
- 바이너리 코드 10진수(BCD)
레퍼런스
- ^ 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.
- ^ a b c Savard, John J. G. (2018) [2007]. "The Decimal Floating-Point Standard". quadibloc. Archived from the original on 2018-07-03. Retrieved 2018-07-16.
- ^ "IBM z9 EC and z9 BC — Delivering greater value for everyone" (PDF). 306.ibm.com. Retrieved 2018-07-07.
- ^ "Arithmetic IPs for Financial Applications - SilMinds". Silminds.com.
- ^ "Chapter 4. Data Formats". Sparc64 X/X+ Specification. Nakahara-ku, Kawasaki, Japan. January 2015. p. 13.
- ^ "Decimal floating point in .NET". Yoda.arachsys.com.
- ^ 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.
- ^ IBM의 10진 부호화 규격 버전 1.00
- ^ 컴퓨터 하드웨어가 반드시 정확한 값을 계산하는 것은 아닙니다. 무한정 정확한 결과를 계산한 것처럼 동등한 반올림 결과를 생성하기만 하면 됩니다.
- ^ 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])
- ^ 미국 특허 3037701A, Huberto M Sierra, "계산기의 부동 소수점 산술 제어 수단", 1962-06-05 발행
추가 정보
- 소수점 부동 소수점: 컴퓨터를 위한 알고리즘, 제16회 컴퓨터 산술 심포지엄 진행 (Cowlishaw, Mike F., 2003)