C

C언어를 가르칩니다.

C C언어를 가르칩니다.

float, double

float, double 데이터형을 간략히 알아봅니다.

부동소수점 수

부동 소수점 수(floating-point number)란 간단히 말해 소수부가 있는 수입니다. 어렵게 말하면 과학적 표기법에 쓰는 수입니다.

과학적 표기법과 지수 표기법

천문학에서는 경은 우습게 넘어가는 아주 큰 숫자를 다루는 일이 비일비재하고, 물리학에서는 0.0000000000000000.....0001과 같이 아주 작은 수를 다루는 일이 흔합니다.

지구와 태양 사이의 거리는 149,570,870,700m입니다. 그럼 매번 계산을 할 때마다 저 수를 그대로 써야 할까요? 그냥, 149,570,870,700은 대충 149,600,000,000으로 퉁치면 안될까요?

돈으로 생각해볼까요? 제 통장 잔고는 320조 1234만 5678원입니다. 그럼 저는 제 통장에 320조 1234만 5678원이 있다고 기억할까요? 그냥 '대충 320조 쯤 있어~'라고 기억하게 될 겁니다. 320조에 비해 천만 원은 너무나 작고 신경쓸 필요도 없으니까요.

마찬가지입니다. 149,570,870,700m 앞에 태양이 있든 149,600,000,000m 앞에 태양이 있든 그게 그거죠. 뒤에 오는 870,700이야 1억 4천만에 비하면 너무나 작지 않습니까. 고려하지 않고 반올림해도 그만입니다.

작은 수도 똑같습니다. 전자의 질량이 0.000000000000000000000000000000000000009123471987221236193828083964327935 g이라고 합시다(실제 값과 다릅니다). 그럼 우리는 0.000000000000000000000000000000000000009123471987221236193828083964327935라는 숫자를 다 기억해야 할까요? 그냥 소수점 뒤에 0이 몇 개 오고, 그 뒤에 91234가 붙는다는 사실만 알면 되지 않을까요? 그러니까 0.0000000000000000000000000000000000000091234로 생각하면 되겠죠.

그런데 문제가 하나 더 있습니다. 대충 퉁치긴 했는데 그래도 자릿수가 너무 커요. 그런데 10진수에서 자릿수는 10의 제곱마다 늘어나죠? 그럼 123,456,789,123,456는 간단히 1.234*10^14로 생각하면 짧아지죠.

그렇게 아주 크거나 아주 작은 수를 다룰 때는 자릿수를 줄이고 근사값을 쓰는 게 편리하므로 쓰는 표기법이 과학적 표기법입니다. 1.234*10^14와 같은 것 말이죠. 그리고 컴퓨터는 이것을 지수 표기법으로 바꿔서 씁니다. 표기법은 다음과 같습니다

149,570,870,700=1.496e+8

0.000000000000000000000000000000000000009123471987221236193828083964327935

​=9.1234e-39

여기서 e 뒤에 오는 숫자는 10의 몇 제곱인지를 나타냅니다. 즉, 1.496e+8은 1.496*10^8입니다. 1.496에 10의 8제곱을 곱한 뜻이란 말이죠. 9.1234e-39는 9.1234*10^-39입니다. 9.1234에 10의 -8제곱을 곱한 뜻이란 말이죠. 음수 제곱을 모르신다면 인터넷에서 검색해보세요.

프로그래밍 언어에서 소수부

1.234같이 소수부가 짧은 수는 소수부를 금방 외울 수 있지만, 0.0000000128341963429165같은 수는 외우려면 어디다 적어놔야 합니다. 어디다 적어놓으려면 적을 종이가 필요하죠. 이걸 컴퓨터에 그대로 대입해 생각해봅시다. 소수부를 기억하려면 메모리가 필요합니다. 그런데 메모리를 한없이 쓸 수가 없잖아요. 그래서 소수점 몇째 자리까지만 남기고 뒷부분은 다 잘라서 저장합니다. 1000.1234567890123456789을 1000.123456으로 잘라서 저장한다는 거죠. 여기서 잘리지 않고 저장된 1 2 3 4 5 6을 유효숫자라 합니다..

float

정의

부동소수점 수 Floating point number에서 이름을 따서 float형입니다. 최소 표현 범위도 10^-37부터 10^37까지로 int보다 넓습니다. 유효숫자는 첫 6자리까지가 최솟값입니다(컴파일러마다 유효숫자 범위가 다릅니다).

선언

float a; //선언
a=2161516.5497234f; //초기화
float b=25302735.235801f; //선언 및 초기화

float c=23e-19; // 지수 표기법 초기화
float d=99e10; //지수 표기법 초기화(+는 생략 가능)
float e=100E-5; //대문자 지수 초기화도 가능
float f=.2; // 지수부 생략 초기화(0.2)
float g=100.; // 소수부 생략 초기화(100.0000...)
float h=3333.2961251283012582346235; // 형변환 및 초기화
​float i=3333.215317 * 1023.23952; //형변환 및 초기화
3행처럼 f를 추가하면 25302735.235801을 처음부터 float형으로 취급하고 그대로 b에 대입합니다.
10행처럼 f를 빼면, 3333.2961251283012582346235를 double로 취급하고, float형으로 바꾼 뒤, h에 대입합니다. C는 소수부가 있는 수는 기본적으로 double로 취급합니다.
11행에서는, 일단 3333.215317과 1023.23592를 모두 double로 취급하여 계산합니다. 결과값도 double입니다. 그 결과값을 float형으로 바꾸어 i에 대입합니다. 왜 이렇게 할까요? 계산 정확도가 높아져서 그렇습니다.  double은 float보다 유효 숫자 범위가 크므로 float보다 더 정밀한 계산이 가능합니다. 그리고 그 결과값으로 반올림까지 할 수 있죠. 단점도 있습니다. 속도가 조금 느려집니다. double을 써야 할 만큼 정밀한 계산이 아니라면, 그냥 처음부터 f를 넣어 계산하여 속도를 향상시키는 게 좋습니다.

크기

보통 32비트를 차지합니다. 앞 8비트는 지수부(10의 거듭제곱 수, e 뒤에 들어가는 숫자)를 저장하고, 나머지 24비트가 가수부(1.432e-19에서 1.432)를 저장합니다.

​double

정의

Double. 두 배란 뜻이죠. 유효 숫자 범위가 최소 10자리입니다. 많은 컴파일러가 13자리 이상을 지원합니다.

선언

double c; // 선언
c=2222.123580123; // 초기화
double d=12347612.67012374075; //선언 및 초기화

크기

보통 64비트입니다. 지수부와 가수부에 몇 비트씩 할당할까요? 컴파일러마다 다릅니다. 가수부에 많이 할당하면 유효 숫자 범위가 늘어나고, 지수부에 많이 할당하면 더 큰 수를 표시할 수 있겠죠.

 

출력

float a=22366.2f;
double b=9999999.23334;

printf("float형 변수 a의 값은 %f입니다.\n", a);
printf("double형 변수 b의 값은 %f입니다.\n", b);
printf("a는 지수 표기법으로 %e입니다.\n", a);
printf("b는 지수 표기법으로 %E입니다.\n", b);
언급하지 않은 코드의 나머지 부분은 알아서 채우세요..

댓글

댓글 본문
작성자
비밀번호
버전 관리
truelight
현재 버전
선택 버전
graphittie 자세히 보기