본문 바로가기
Programming

float, double 소수점 아래 계산 오류

by 단창 2011. 11. 22.
float 의 경우 소수점 6자리 밑으로의 소수점은 믿을 수 없다 라고만 알고 있었지만 
조금 난감한 문제 에 부딪혔다.

matlab 에서 생성된 수를 c로 짜여진 프로그램으로 TCP/IP로 쏘아서 계산을 하여야 하는데,
c에서 받은 값은 정상인데 계산을 돌려도 제대로나오지 않는 것이다. 
예를 들어보면

 === matlab ===
x = 1: 116;
data3 = sin(x*2+3);
data4 = sin(x*2 +7);

 >>data3(116) 
을 하면  0.5806 이 나온다. 
당연히 이 값은  0.5806 이 아니다. 보여지는 출력형태가 소수점 아래 4자리로 고정 되어 있을 뿐이지 풀어서 보면,
 
>> format('longE')
>> data3(116)
 5.805866409896447e-01

이라는 수가 나온다.
이것을 C로 가져와 data라는 float타입 변수에 담았다고 하자.

그리고 계산을 하는데,
data^2
data^3
의 계산 과정동안 유효숫자를 넘어가는 계산이 반복되고 
소수점은 e-38 정도까지 내려 가게 되었다.
계산을 좀더 진행하면, 
분명히 나와야 할 값이 0 이나, inf, 또는 -nan 의 엉뚱한 계산 결과를 내어버리고 만다.

어떻게 해결해야 하는거지....  애초에 생성된 수에서 소수점 6자리 밑으로 짜르고 시작 해야 하나..? 
시작을 6자리로 하더라도 곰셈계산을 하다보면 소수점이 계속 커지는데, 유효값만 내가 추려내는 코드를 따로 넣어주어ㅑ 하는 건가? float 곱셈하면서 코드 작성자가 이런것 소수점 짜리는 코드 까지 신경쓰는건 좀 아닌것 같은데.. 

내가 방법을 모르는것 같다. 


 
반응형