부동 소수점 표현 방식은 수를 (가수)×(밑수)(지수)와 같이 유효숫자를 사용한 곱셈 형태로 표현한다.
유효 숫자를 잃어버리는 문제 뿐만 아니라, π와 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