본문 바로가기

c

실수 자료형 반올림 오차

C언어에서 int형은 CPU가 가장 효율적으로 다룰수 있는 정수형이라 정의한다.

CPU가 한번에 처리할 수 있는 양 즉, 레지스터(임시 저장장소)의 크기를 int형의 크기로 정하며

int형의 크기는 32비트 운영체제 가진 컴퓨터는 32bit=4byte이며,

64비트 운영체제(원도우 7 64bit)를 가진 컴퓨터는 int형이 64bit=8byte이 된다.

(최근에는 비주얼 C++과 Dev-C++은 __int64라는 64bit int형을 지원한다.) 

컴퓨터 레지스터의 비트수가 많을 수록 더 성능이 좋다고 할 수 있다.

그래서 CPU를 많이 사용하는 프로그램은 효율성을 위해 32bit, 64bit 프로그램이 따로 있을 정도이다.

after effect, maya, 3d max등 그외 렌더링 프로그램, 인코딩 프로그램

 

 

  

수식내에서 char, unsigned char, enum형은 int형으로 자동 확장되며 float형은 double형으로 자동 확장된다.

따라서 컴파일러는 기본적으로 실수형 상수를 따로 지시(접미어F,f 또는 캐스트연산자)를 하지 않으면 double형으로 간주한다.
 

 float base1 = 4.0 x 2.0 float base2 = 4.0F x 2.0F

 4.0과 2.0을 double형으로 취급하여 계산

 base1에 float 크기로 축약하여 저장

 4.0과 2.0을 float형으로 취급하여 계산

 base1에 저장

 계산정밀도 ↑, 계산속도↓

 계산속도↑

 

이렇게 처리하다 보니 float형과 double형이 정밀도 차이 때문에 실수형을 계산할 때 오차가 나게 마련이다.

#include<stdio.h>
int main(void){

float a, b;
b= 2.0e20+1.0;
a=b-2.0e20;

printf("%f ",a);
return 0;
}
=> 결과가 1이 나오지 않는다.
 #include <stdio.h>
int main(void){

float a, b;
b= 2.0e4+1.0;
a=b-2.0e4;

printf("%f ", a);
return 0;

=> 결과가 1이 나온다.

 
2.0e20-> 2 다음 0이 20개 있는 수 +1 
이 연산을 정확하기 위해 자료형은 21자리의 숫자를 저장할 수 있어야 함 


그러나 float 형 숫자의 가수부 6~7 => 컴퓨터가 정확한 계산을 위해 충분한 자릿수가 없기 때문에 생각했던 결과가 나오지 않는다.

 
2.0e4-> 2 다음 0이 4개 있는 수 +1 
자료형은 5자리의 숫자를 저장할수 있으면 됨

 

'c' 카테고리의 다른 글

루프  (0) 2012.11.06
콤마 연산자  (0) 2012.11.05
형 변환  (0) 2012.11.04
scanf 특징  (0) 2012.11.03
기본 데이터형  (0) 2012.11.02