부동 소수점 수를 사용할 때의 주의점

부동 소수점은 프로그램에서 소수를 다루기 위해서 널리 이용되고 있지만 조금 독특한 데이터 형이므로 그 특성을 잘 이해하고 이용하지 않으면 뜻밖의 함정에 빠질 수 있다.

 

부동 소수점의 특성으로 주의할 점은 다음과 같다.

a) 부동 소수점 연산에 고유의 오차가 항상 생길 수 있다.

b) 빌드 환경이나 옵션에 의해 동일한 소스 코드에서도 계산 결과가 달라질 수 있다.

c) 실행하는 CPU가 바뀌면 동일한 실행 모듈에서도 계산 결과가 달라질 수 있다.

 

 

소수 계산을 할 경우의 설계·프로그래밍 방침

1). 부동 소수점 연산 결과에 대해서는 유효 자릿수 범위에서 평가한다

 

부동 소수 점을 다루는 데이터 형에는 유효 자릿수를 규정하고 있다.

예를 들면 .NET Framework float 형의 경우 유효 자릿수 7자리, double 형이라면 유효 자릿수는 15~16자리 수 정도로 정의되어 있다.

 

부동 소수점의 특성상 유효 자릿수 이상의 자릿수에 대한 연산 결과는 부정이며 이 부분을 평가 대상으로 하는 시스템 설계 및 프로그래밍은 피할 필요가 있다.

예컨대 소수 값 일치를 평가하는 경우 아래 코드에서는 전자의 비교 연산자 "=="를 사용하는 방법으로는 보통 의도한 결과를 얻을 수 없다.

 

때문에 후자처럼 오차의 발생을 고려한 비교로 대용할 필요가 있다.

 

Double val_1=0.1+0.2+0.3;

Double val_2=0.6;

const Double Eps=0.000000000000001;

 

//부적절한 비교 방법

if(val_1==val_2)

{

    Console.WriteLine("변수 val_1 val_2는 똑같다");

}

 

//오차를 고려한 비교 방법

if(Math.Abs(val_1– val_2)<Eps)

{

    Console.WriteLine("변수 val_1 val_2는 거의 같다");

}

 

그 외 정수 변환에서는 Math.Round, Math.Floor, Math.Ceiling 라는 메소드나 정수형으로 캐스트를 이용할 수 있지만 이들의 동작을 이해하고 목적에 맞은 것을 이용하자.

 

 

2). 그래도 연산 오차 최소화가 필요한 경우는 10진 형식 타입 이용을 검토하자

 

 

출처: https://blogs.msdn.microsoft.com/jpvsblog/2014/10/28/93/

 

 

저작자 표시
신고
by 흥배 2016.07.08 08:00
| 1 |