부동 소수점 표현 방식은 수를 (가수)×(밑수)(지수)와 같이 유효숫자를 사용한 곱셈 형태로 표현한다.

 
±(1.m) x 2e-127
 

유효 숫자를 잃어버리는 문제 뿐만 아니라, π와 0.1를 정확하게 표현하지 못하는 문제다른 약간의 부정확성이 다음과 같은 현상을 일으킨다.

1. 소거
거의 같은 두 값을 빼는 것은 정확성을 매우 많이 잃게 된다. 이 문제가 아마도 가장 일반적이고 심각한 정확도 문제이다.

2. 정수로의 변환 문제
(63.0/9.0)을 정수로 변환하면 7이 되지만 (0.63/0.09)는 6이 된다. 이는 일반적으로 반올림 대신 버림을 하기 때문이다.

3. 제한된 지수부
결과값이 오버플로우되어 무한대값이 되거나 언더플로우되어 비정상 값 또는 0이 될 수 있다. 만약 비정상 값이 되면 유효숫자를 완전히 잃어버린다.

4. 나눗셈이 안전한지 검사하는데 문제가 생김
제수(나눗수)가 0이 아님을 검사하는 것이 나눗셈이 오버플로우되고 무한대값이 되지 않는 걸 보장하지 않는다.

5. 같음을 검사하는데 문제가 생김
수학적으로 같은 계산결과가 나오는 두 계산 순서가 다른 부동소수점 값을 만들어낼 수 있다. 프로그래머는 어느정도의 허용 오차를 가지고 비교를 수행하지만, 그렇다고 해서 문제가 완전히 없어지지 않는다.

컴퓨터가 부동소수점 방식을 이용하는 한 이 문제는 해결할 방법이 없다고 보면 된다. 이를 숙지하길 바란다. 아래의 Java와 C/C++ 예제를 통해 테스트 해보길 권한다.

Java float 계산 예제


public class 
FloatTest {
  public static void main(String[] args) {

    float f = 0;
    
    for(int i = 0; i < 100; i++) { f += 0.1; }
    System.out.print(f);
  }
}



C/C++ float 계산 예제


#include<stdio.h>

int main(void) {
      int i; float f = 0;

      for(i=0; i < 100; i++) { f += 0.1; }
      printf("%f\n", f);
 
      return 0;
}


상세내용 참조 : 한글 위키백과
http://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

Posted by 리트모스
: