다음을 통해 공유


부동 소수점 연산은 Excel에서 부정확한 결과를 제공할 수 있습니다.

요약

이 문서에서는 Microsoft Excel에서 부동 소수점 숫자를 저장하고 계산하는 방법에 대해 설명합니다. 반올림 또는 데이터 잘림으로 인해 일부 숫자 또는 수식의 결과에 영향을 줄 수 있습니다.

개요

Microsoft Excel은 부동 소수점 숫자를 저장하고 계산하는 방법을 결정하기 위해 IEEE 754 사양에 따라 설계되었습니다. IEEE는 주로 컴퓨터 소프트웨어 및 하드웨어에 대한 표준을 결정하는 국제 기구인 Institute of Electrical and Electronics Engineers입니다. 754 사양은 부동 소수점 숫자를 이진 컴퓨터에 저장하는 방법을 설명하는 널리 채택된 사양입니다. 부동 소수점 숫자를 적당한 양의 공간에 저장하고 계산을 비교적 빠르게 수행할 수 있기 때문에 인기가 있습니다. 754 표준은 Intel, Motorola, Sun 및 MIPS 프로세서를 포함하여 부동 소수점 수학을 구현하는 거의 모든 오늘날 PC 기반 마이크로프로세서의 부동 소수점 단위 및 숫자 데이터 프로세서에 사용됩니다.

숫자가 저장될 때 해당 이진 숫자는 모든 숫자나 소수점 숫자를 나타낼 수 있습니다. 예를 들어 1/10 분수는 10진수 형식인 0.1로 나타낼 수 있습니다. 그러나 이진 형식의 동일한 숫자는 다음처럼 반복되는 이진 소수점이 됩니다.

0001100110011100110011 (등)

이것은 무한 반복될 수 있습니다. 이 숫자는 유한(제한된) 공간으로 나타낼 수 없습니다. 따라서 이 숫자는 저장될 때 약 -2.8E-17로 반올림됩니다.

그러나 IEEE 754 사양에는 다음과 같은 세 가지 일반 범주에 속하는 몇 가지 제한 사항이 있습니다.

  • 최대/최소 제한
  • Precision
  • 반복되는 이진수

추가 정보

최대/최소 제한

모든 컴퓨터에는 처리할 수 있는 최대 및 최소 수가 있습니다. 숫자가 저장되는 메모리 비트 수가 제한적이기 때문에 저장할 수 있는 최대 또는 최소 개수 역시 유한합니다. Excel의 경우 저장할 수 있는 최대 수는 1.79769313486232E+308이며, 저장할 수 있는 최소 양수는 2.2250738585072E-308입니다.

IEEE 754를 준수하는 경우

  • 언더플로: 너무 작은 숫자가 생성되어 나타내지 못하면 언더플로가 발생합니다. IEEE 및 Excel에서 결과는 0입니다(IEEE의 개념이 -0이고 Excel에서는 그렇지 않음).
  • 오버플로: 숫자가 나타내지 못할 정도로 너무 크면 오버플로가 발생합니다. Excel은 이 경우에 자체적인 특수 표현을 사용합니다(#NUM!).

IEEE 754를 준수하지 않는 경우

  • 비정규화된 숫자: 비정규화된 숫자는 0의 지수로 나타냅니다. 이 경우 전체 숫자가 가수부(mantissa)에 저장되고 이 가수부에는 암시적인 선행 1이 없습니다. 따라서 정밀도가 손실되는데 숫자가 작을수록 손실되는 정밀도가 더 많습니다. 이 범위의 작은 쪽 끝에 있는 숫자는 한 자릿수의 정밀도만 가집니다.

    예: 정규화된 숫자에는 암시적인 선행 1이 있습니다. 예를 들어 가수부가 0011001을 나타내면 암시적인 선행 1로 인해 정규화된 숫자가 10011001이 됩니다. 비정규화된 숫자에는 암시적 선행 숫자가 없으므로 0011001 예제에서는 비정규화된 숫자가 동일하게 유지됩니다. 이 경우 정규화된 숫자에는 8개의 유효 자릿수(10011001)가 있는 반면 비정규화된 숫자에는 5개의 유효 자릿수(11001)가 존재하고 선행 0은 유효하지 않습니다.

    비정규화된 숫자는 기본적으로 표준 하한보다 작은 숫자를 저장할 수 있도록 하는 해결 입니다. Microsoft는 기본적으로 비정규화된 숫자가 유효 자릿수가 가변적이기 때문에 사양의 선택적 부분을 구현하지 않습니다. 이렇게 하면 계산에 심각한 오류가 발생할 수 있습니다.

  • 양수/음수 무한대: 0으로 나누면 무한대가 발생합니다. Excel에서는 무한대 대신 #DIV/0을 지원합니다. 오류가 발생할 수 있습니다.

  • Not-a-Number(NaN): NaN은 잘못된 연산(예: 무한대/무한대, 무한대-무한대 또는 -1의 제곱근)을 나타내는 데 사용됩니다. NaN을 사용하면 프로그램이 잘못된 연산을 계속 진행할 수 있습니다. 대신 Excel에서 오류(예: #NUM! 또는 #DIV/0!.)를 즉시 생성합니다.

Precision

부동 소수점 숫자는 부호, 지수 및 가수부 등 65비트 범위 내의 세 부분으로 이진 파일에 저장됩니다.

기호 지수 가수부
1 부호 비트 11비트 1 암시적 비트 + 52비트 분수

부호는 숫자의 부호(양수 또는 음수)를 저장하고, 지수는 숫자를 높이거나 낮출 2의 거듭제곱을 저장합니다(2의 최대/최소 거듭제곱은 +1,023 및 -1,022). 가수부는 실제 숫자를 저장합니다. 가수부의 유한 저장 영역은 인접한 두 개의 부동 소수점 숫자가 서로 얼마나 가까운지(즉, 정밀도)를 제한합니다.

가수부와 지수는 둘 다 별도의 구성 요소로 저장됩니다. 따라서 가능한 정밀도의 양은 조작하는 숫자(가수부)의 크기에 따라 달라질 수 있습니다. Excel의 경우, Excel은 1.79769313486232E308에서 2.2250738585072E-308까지의 숫자를 저장할 수 있지만 15자리 정밀도 내에서만 가능합니다. 이 제한은 IEEE 754 사양을 엄격하게 따르는 직접적인 결과이며 Excel의 제한 사항은 아닙니다. 이 정밀도 수준은 다른 스프레드시트 프로그램에서도 찾을 수 있습니다.

부동 소수점 숫자는 다음 형태로 표현됩니다. 여기서 지수는 이진 지수입니다.

X = 분수 * 2^(지수 - 편차)

소수점은 숫자의 정규화된 소수 부분으로, 선행 비트가 항상 1이 되도록 지수가 조정되므로 정규화됩니다. 이렇게 하면 저장할 필요가 없으며 한 비트 이상의 정밀도를 얻을 수 있습니다. 이것이 암시적 비트가 있는 이유입니다. 이것은 소수점 왼쪽에 한 자리 숫자를 들이기 위해 지수를 조작하는 과학적 표기법과 비슷합니다. 1과 0만 있기 때문에 이진을 제외하고는 항상 첫 번째 비트가 1이 되도록 지수를 조작할 수 있습니다.

편차는 음수 지수를 저장해야 하는 필요성을 없애는 데 사용되는 편차 값입니다. 단정밀도 숫자의 편차는 배정도 숫자에 대해 127과 1,023(10진수)입니다. Excel은 배정도를 사용하여 숫자를 저장합니다.

매우 큰 수를 사용하는 예제

새 통합 문서에 다음을 입력합니다.

A1: 1.2E+200
B1: 1E+100
C1: =A1+B1 

C1 셀의 결과 값은 셀 A1과 같은 값인 1.2E+200입니다. 실제로 IF 함수(예: IF(A1=C1)를 사용하여 셀 A1과 C1을 비교하면 결과는 TRUE가 됩니다. 이것은 정밀도의 15자리 유효 자릿수만 저장하는 IEEE 사양으로 인해 발생했습니다. 위의 계산을 저장하려면 Excel에서 100자릿수 이상의 정밀도를 필요로 하게 됩니다.

매우 작은 숫자를 사용하는 예제

새 통합 문서에 다음을 입력합니다.

A1: 0.000123456789012345
B1: 1
C1: =A1+B1 

C1 셀의 결과 값은 1.000123456789012345 대신 1.00012345678901입니다. 이것은 정밀도의 15자리 유효 자릿수만 저장하는 IEEE 사양으로 인해 발생했습니다. 위의 계산을 저장할 수 있도록 하려면 Excel에 19자리 이상의 정밀도가 필요합니다.

정밀도 오류 수정

Excel은 반올림 오류를 보정하는 두 가지 기본 방법을 제공합니다. 하나는 ROUND 함수이고 다른 하나는 표시된 정밀도 또는 표시된 대로 정밀도 설정 통합 문서 옵션입니다.

방법 1: ROUND 함수

이전 데이터를 사용하여, 다음은 ROUND 함수를 사용하여 숫자를 5자리까지 강제로 설정하는 예제입니다. 이렇게 하면 결과를 다른 값과 성공적으로 비교할 수 있습니다.

A1: 1.2E+200
B1: 1E+100
C1: =ROUND(A1+B1,5) 

그러면 결과가 1.2E+200이 됩니다.

D1: =IF(C1=1.2E+200, TRUE, FALSE)

그러면 값이 TRUE가 됩니다.

방법 2: 표시된 정밀도

경우에 따라 표시된 정밀도 옵션을 사용하여 반올림 오류가 작업에 영향을 미치는 것을 방지할 수 있습니다. 이 옵션을 사용하면 워크시트에 있는 각 숫자의 값이 강제로 표시됩니다. 이 옵션을 켜려면 다음 단계를 따르십시오.

  1. 파일 메뉴에서 옵션을 클릭한 다음, 고급 카테고리를 클릭합니다.
  2. 이 통합 문서 계산 시 섹션에서 원하는 통합 문서를 선택하고 표시된 대로 정밀도 설정 확인란을 선택합니다.

예를 들어 소수점 두 자리를 표시하는 숫자 형식을 선택한 다음, 표시된 정밀도 옵션을 켜면 통합 문서 저장 시 소수점 이하는 두 자리를 초과하는 모든 정확도가 손실됩니다. 이 옵션은 모든 워크시트를 포함한 활성 통합 문서에 영향을 미치게 됩니다. 이 옵션을 실행 취소하고 손실된 데이터를 복구할 수 없습니다. 이 옵션을 활성화하기 전에 통합 문서를 저장하는 것이 좋습니다.

결과가 거의 0에 가까운 반복되는 이진 수 및 계산

이진 형식의 부동 소수점 숫자의 스토리지에 영향을 주는 또 다른 혼란스러운 문제는 소수점 10의 유한하고 반복되지 않는 일부 숫자가 무한하고 이진 숫자로 반복된다는 것입니다. 가장 일반적인 예로는 값 0.1 및 해당 변형이 있습니다. 이러한 숫자는 base 10에서 완벽하게 나타낼 수 있지만, 이진 형식의 동일한 숫자는 가수에 저장될 때 다음과 같은 반복 이진 번호가 됩니다.

000110011001100110011(등)

IEEE 754 사양은 어떤 숫자도 특별한 허용을 하지 않습니다. 이것은 가능한 것은 가수부에 저장하고 나머지는 잘라냅니다. 그러면 저장 시 약 -2.8E-17 또는 0.000000000000000028에 대한 오류가 발생합니다.

10진수 0.0001과 같은 일반적인 소수점도 이진으로 정확하게 나타낼 수 없습니다. (0.0001은 104비트의 주기를 가진 반복되는 이진 분수입니다). 이는 분수 1/3을 10진수로 정확하게 나타낼 수 없는 이유와 비슷합니다(반복 0.3333333333333333333333333333).

예를 들어 Microsoft Visual Basic for Applications의 다음 예제를 살펴보겠습니다.

   Sub Main()
      MySum = 0
      For I% = 1 To 10000
         MySum = MySum + 0.0001
      Next I%
      Debug.Print MySum
   End Sub

그러면 출력으로 0.999999999999996이 인쇄됩니다. 이진수로 0.0001을 나타낼 때 작은 오류는 합계로 전파됩니다.

예: 음수 추가

  1. 새 통합 문서에 다음을 입력합니다.

    A1: =(43.1-43.2)+1

  2. A1 셀을 마우스 오른쪽 단추로 클릭한 다음 셀 서식을 클릭합니다. 번호 탭에서 범주 아래에 있는 과학적을 클릭합니다. 소수점 자리를 15로 설정합니다.

Excel은 0.9를 표시하는 대신 0.899999999999999를 표시합니다. (43.1-43.2)이 먼저 계산되어 -0.1이 일시적으로 저장되고 -0.1 저장 오류가 계산에 됩니다.

값이 0에 도달할 때의 예

  1. Excel 95 이전 버전에서 새 통합 문서에 다음을 입력하십시오.

    A1: =1.333+1.225-1.333-1.225

  2. A1 셀을 마우스 오른쪽 단추로 클릭한 다음 셀 서식을 클릭합니다. 번호 탭에서 범주 아래에 있는 과학적을 클릭합니다. 소수점 자리를 15로 설정합니다.

Excel 95에서는 0을 표시하는 대신 -2.22044604925031E-16을 표시합니다.

하지만 Excel 97에서는 이 문제의 해결을 시도하는 최적화를 도입했습니다. 추가 또는 빼기 작업으로 인해 값이 0 또는 0에 매우 가깝게 표시될 경우 Excel 97 이상이면 이진 파일을 대상으로 피연산자를 변환한 결과로 발생하는 모든 오류를 보상합니다. 위 예제는 Excel 97 이상에서 수행될 때 0 또는 0.000000000000000E+00을 과학적 표기법으로 올바르게 표시하는 예제입니다.

부동 소수점 숫자 및 IEEE 754 사양에 대한 자세한 내용은 다음 World Wide 웹 사이트를 참조하세요.