(완료) IEEE 부동 소수점 오류의 이해를 자습서

만료된 KB 콘텐츠 고지 사항

이 문서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 작성되었습니다. 따라서 이 문서는 “있는 그대로" 제공되며 더 이상 업데이트되지 않습니다.

요약

부동 소수점 연산은 많은 프로그래머가 혼동 하는 복잡 한 주제입니다. 다음 자습서는 부동 소수점 오류가 발생할 가능성이 있는 프로그래밍 상황과 대처 방법 인식 하는 데 도움이 됩니다. 또한 실제 컴파일러 버그와는 달리 근본적인 부동 소수점 연산 제한으로 인 한 사례를 인식할 수 있습니다 허용 해야 될.

자세한 내용

10 진수 및 이진 숫자 시스템

10에서 일 수 있습니다. 해당 자료는 임의적인 것입니다. 유일한 이유 사람들이 10에 전통적으로 사용 되어 손가락이 10 개이기 유용한 계산 도구에 대 한 있는입니다.


10 진수 (밑이 10) 수 532.25 의미 다음.

   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
500 + 30 + 2 + 2/10 + 5/100
_________
= 532.25


이진수 숫자 체계 (2 진법) 각 열 10 대신 2의 거듭제곱을 나타냅니다. 예를 들어, 다음 번호 101.01를 의미.

   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
4 + 0 + 1 + 0 + 1/4
_________
= 5.25 Decimal


Pc에서 정수를 표현 하는 방법

소수 부분이 정수로 때문에 컴퓨터 표현 부동 소수점 값에 비해 훨씬 간단 하 게 됩니다. 개인용 컴퓨터 (Pc)에서 일반 정수는 2 바이트 (16 비트) 부호를 나타내는 최상위 비트를 사용 하 여 긴 긴 정수는 4 바이트입니다. 양수는 간단한 이진수입니다. 예를 들어:

    1 Decimal = 1 Binary
2 Decimal = 10 Binary
22 Decimal = 10110 Binary, etc.


그러나, 음의 정수는 2의 보수 체계를 사용 하 여 표시 됩니다. 음수를 2의 보수 표현을 얻으려면 수의 절대값에 대 한 이진 표현을 하 모든 비트를 대칭 및 1 추가. 예를 들어:

   4 Decimal = 0000 0000 0000 0100
1111 1111 1111 1011 Flip the Bits
-4 = 1111 1111 1111 1100 Add 1


-1 소수 1111 이며 따라서 Basic-1 true 논리 것으로 취급 하는 이유를 설명 하는 = (모든 비트 = 1). 이것은 비트 단위나 논리 비교 위한 별도 연산자의 결과입니다. 종종 basic에서 것이 편리한 경우 프로그램 하 게 될 많은 논리 비교 하는 아래 코드 조각을 사용 하 여입니다. 이렇게 가독성을 크게 도움이 됩니다.

   CONST TRUE = -1
CONST FALSE = NOT TRUE


2의 조합에 추가 보완 함께 일반 이진 산술을 사용 하 여 숫자를 올바른 결과 생성 합니다.

부동 소수점 복잡

모든 10 진 정수에 의해 이진 정수 정확 하 게 나타낼 수 그러나 이것은 소수에 대 한 사실이 아닙니다. 사실 10에서 유리 되지 않은 모든 번호 또한 됩니다 합리적인 수가 10 보다 작은 시스템.


이진 (binary) 특히만 소수 양식 p/q, q는 2의 정수 배수는 표현할 수 있는 나타낼 수 있습니다 정확히 한정 된 수의 비트를 사용 하 여.


10 진수 0.0001과 같은 일반적인 소수 분수 진수로 정확히 표현할 수 없습니다. (0.0001은 104 비트 마침표가 있는 반복 되는 이진 소수!)


이러한 이유는 다음과 같은 간단한 예제에서는

   SUM = 0
FOR I% = 1 TO 10000
SUM = SUM + 0.0001
NEXT I%
PRINT SUM ' Theoretically = 1.0.


출력으로 1.000054 인쇄 됩니다. 진수로 0.0001의 작은 오류가 합계에 전파 됩니다.


같은 이유로, 항상 매우 주의 해야 실수에 비교를 할 때. 다음 예제는 일반적인 프로그래밍 오류입니다.

   item1# = 69.82#
item2# = 69.20# + 0.62#
IF item1# = item2# then print "Equality!"


여 69.82 이진 파일 (바이너리)에서 약간 다를 수 배정 결과 값으로 정확 하 게 표현할 수 없기 때문에 "Equality!" 인쇄 되지 것입니다이 식에서 생성 되는 값입니다. 실제로 일부 허용 오차를 허용 하는 방식으로 이러한 비교를 항상 코드 야. 예를 들어:

   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"


이 "같음" 인쇄 됩니다.

IEEE 형식 번호

MS-DOS 버전 3.0에 대 한 QuickBasic 수치 연산 보조 프로세서를 사용 하 여 컴퓨터에 대 한 IEEE (연구소의 전기 및 전자 기술자) 버전과 MBF (Microsoft 이진 부동 소수점) 버전으로 배송 되었습니다. QuickBasic ms-dos, 버전 4.0 이상 IEEE 사용합니다. Microsoft는 IEEE 표준을 세 가지 주요 이유는 기본의 현재 버전의 부동 소수점 값을 나타내기 위해 선택 했습니다.

  1. Basic IEEE 형식을 사용 하는 인텔 수학 보조 프로세서를 사용 하 여 허용 합니다. Microsoft 이진 형식 숫자를 사용 하 여 Intel 계열 80 x 87 보조 프로세서를 사용할 수 없습니다.
  2. Interlanguage 호출 Basic, C, 파스칼, 포트란, 및 MASM 간에 손쉽게 만드는 것입니다. 그렇지 않으면 변환 루틴 다른 한 언어에서 숫자 값을 보내는 데 사용할 필요가 있습니다.
  3. 일관성을 얻기 위해서입니다. IEEE 표준 C 및 포트란 컴파일러에 대 한 승인 된 산업입니다.
다음은 두 자리 수에 대 한 IEEE와 MBF 표현을 간단히 비교한 것입니다.

               Sign Bits   Exponent Bits   Mantissa Bits
--------- ------------- -------------
IEEE 1 11 52 + 1 (Implied)
MBF 1 8 56


IEEE와 MBF 부동 소수점 표현 된 Microsoft 기술 자료에서 다음 단어를 쿼리 차이에 대 한 자세한 내용은.

   IEEE and floating and point and appnote


참고 IEEE에는 더 넓은 범위의 값을 나타낼 수 있는 지 수에 더 많은 비트입니다. MBF는 좁은 범위 내에서 보다 정확 하 게 수 있는 더 많은 수 비트에 있습니다.

일반 부동 소수점 개념

모든 이진 부동 소수점 시스템 한정 된 개수의 정확한 형식은 부동 소수점 값을 나타낼 수 있습니다 실현 하는 데 매우 중요 합니다. 다른 모든 값은 표현 가능한 가장 가까운 값으로 근사화 되어야 합니다. IEEE 표준은 값을 "가장 가까운" 표현 가능한 값을 반올림 하는 방법을 지정 합니다. QuickBasic MS-DOS에 대 한 표준을 지원 하 고 IEEE 규칙에 따라 반올림 합니다.


또한 IEEE에서 표현할 수 있는 숫자는 범위가 매우 넓다는 것을 염두에 유지. 상상할 수에 번호 줄에. 표현 가능한 숫자 1.0과-1.0 근처의 고밀도 있지만 적어집니다 때 0 또는 무한대 향해 이동 합니다.


공학 계산을 위한 디자인 된 IEEE 표준의 목적은 정밀도 최대화 하 (하기가 가장 실제에 가까운 숫자). 정밀도를 나타낼 수 있는 자릿수를 나타냅니다. IEEE 표준 허용 한계 범위 내에 정밀도 정확도 유지 하는 숫자의 소수 부분에 사용 되는 비트 수와 지 수 전용된 비트 수의 균형을 시도 합니다.

IEEE 정보

부동 소수점 숫자는 []는 소숫점 다음과 같은 형태로 표시 됩니다.

   X =  Fraction * 2^(exponent - bias)


[분수]의 지 수는 선행 비트가 항상 1 조정 되어 있기 때문에 숫자의 정규화 된 소수부입니다. 이 이렇게 것을 없고가 정밀도 한 비트 늘어납니다. 이 암시적된 비트가 있기 때문입니다. 상상할 수 있는이 과학적 표기법 같은 이진수에서를 제외 하 고는 소수점 왼쪽에 한 자리가 있어야 지 수를 조작 하는 첫 번째 비트는 1, 1과 0만 있기 때문에 항상 지 수를 조작할 수 있습니다.


[바이어스] 음의 지 수를 저장 하는 것을 방지 하기 위해 사용 되는 바이어스 값입니다.


단 정밀도 숫자에 대 한 바이어스는 127이 고 이중 정밀도 숫자 1023 (십진수)입니다.


모든 0 값과 일치 하 고 모두 다 1 (이진수)는 특별 한 경우를 나타내기 위한 예약 되어. 다른 특별 한 경우, 다양 한 오류 조건을 나타내는 있습니다.

단 정밀도 예제

2 = 1 * 2 ^1 = 0100 0000 0000 0000... 0000 0000 = 4000 0000 hex
부호 비트는 0 이며 저장 된 지 수는 128, 또는 100 0000 0 127 + 1 수는 있습니다. 저장 된가 수는 (1.) 000 0000... 0000 0000, 이며 선행 하는 1과 이진 소수점이 있으므로 실제가 수는 1입니다.

-2 =-1 * 2 ^1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hex
부호 비트가 설정 된 점을 제외 하 고 + 2와 같습니다. 모든 IEEE 형식 부동 소수점 숫자에 적용 됩니다.

4 = 1 * 2 ^2 = 0100 0000 1000 0000... 0000 0000 = 4080 0000 hex
가수가 같고, 지 수 증가 하나 (바이어스 된 값은 129 또는 이진수 100 0000 1입니다.

6 = 1.5 * 2 ^2 = 0100 0000 1100 0000... 0000 0000 = 0 0000 40C 16 진수
지 수는가 수는 절반으로-는 (1.) 100 0000... 이진 소수 이기 때문에 1-1/2은 0000 0000 (소수 자릿수 값은 1/2, 1/4, 1/8, 등.).

2 * 1 = 1 ^0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
2 다른 동일 지 수가 수는 1을 뺀 2 127 또는 이진수 011 1111 1입니다.

.75 = 1.5 * 2 ^-1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
바이어스 된 지 수는 126 또는 011 1111 0에서 이진 및가 수는 (1.) 100 0000... 0000 0000는 1-1/2.

2.5 = 1.25 * 2 ^1 = 0100 0000 0010 0000... 0000 0000 = 4020 0000 hex
2 제외 된 상태로 1/4을 나타내는 비트가 수에.

0.1 = 1.6 * 2 ^-4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD 16 진수
1/10은 반복 되는 이진에서 소수입니다. 가 수, 1.6 이며 바이어스 된 지 수는 1.6이 16으로 나뉜다는 말 (십진수에서는 이진수 011 1101 1 경우). 실제 지 수는 123-127 =-4, 곱할 비율은 2 * *-4 = 1/16 있음을 의미 합니다. 저장 된가 수는 마지막 비트에서 반올림 하는 메모입니다. 표시할 수를 최대한 정확 하 게 표시 하려고 한 경우입니다. (이유 1/10과 1/100이 좀 더 정확 하 게 나타낼 수는 1/3을 10 진수로 정확 하 게 표현 하는 방법은 비슷합니다.)

0 = 1.0 * 2 ^-128 = 모두 0--특별 한 경우입니다.

다른 일반 부동 소수점 오류

부동 소수점 일반적인 오류는 다음과 같습니다.

  1. 반올림 오류


    이 오류는 이진수 비트 모든 계산에 사용할 수 없습니다 하는 경우에 발생 합니다.


    예: 0.0001을 0.9900 (단일 정밀도) 추가


    10 진수 0.0001 기호로 표시 됩니다.
    (1.) 10100011011011100010111 * 2^(-14+Bias) (이진수에서 0 앞에 13)!
    0.9900는 기호로 표시 됩니다.
    (1.)11111010111000010100011 * 2^(-1+Bias)
    이제이 숫자를 실제로 추가 하려면 십진 (이진) 포인트 정렬 되어야 합니다. 이 되는 Unnormalized. 결과 더하기가 같습니다.
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
    +.111111010111000010100011 * 2^0
    ________________________________
    .111111010111011100110000 * 2^0


    일부 컴퓨터에 추가할 수 있도록 이동 하는 경우 반올림 때문에이 반올림 오류가 호출 됩니다. 다른 사람이 간단 하 게 자릅니다. 반올림 오류를 고려 하는 추가 하거나 두 가지 매우 다른 값을 곱할 때마다.
  2. 2를 빼면 거의 동일한 값
           .1235
    -.1234
    _____
    .0001


    이 값은 정규화 됩니다. 참고 원래 숫자에서는 유효 숫자가 네 개이지만 있었지만, 결과 유효 숫자가 하나 뿐입니다.
  3. 오버플로 및 언더플로


    이 결과가 너무 크거나 너무 작은 데이터 형식으로 나타낼 수 있을 때 발생 합니다.
  4. 오류 quantizing


    부동 소수점 표준에 의해 정확한 형태로 나타낼 수 없는 숫자를 사용 하 여 발생 합니다.
  5. 으로 매우 작은 숫자 나누기


    이 "0으로 나누기" 오류 트리거할 수 또는 다음 예제와 같이 잘못 된 결과가 발생할 수 있습니다.
          A = 112000000
    B = 100000
    C = 0.0009
    X = A - B / C


    QuickBasic ms-dos, 지금 X가 정답 900000 대신 값을 888887.
  6. 출력 오류


    이 유형의 오류 출력 함수 사용 하 여 값을 변경할 때 발생 합니다.
속성

문서 ID: 42980 - 마지막 검토: 2017. 2. 7. - 수정: 2

피드백