1. 실수형
실수를 표현하는 방법에는 고정소수점법과 부동소수점법이 있다.
고정소수점(fixed-point) : '소수점의 위치가 고정'이라는 의미
ex) 12345.6
부동소수점(floating-point) : '소수점이 떠서 움직인다'는 의미
ex) 1.23456 * $10^4$ ->1.23456e4
12.3456 * $10^3$ ->12.3456e3
기본적으로 double 형식임(8바이트)
실수 | 정규화 | 지수표기법 |
100 | 1.0 * $10^2$ | 1.0e2 |
0.01 | 1.0 * $10^-{2}$ | 1.0e-2 |
123.456 | 1.23456 * $10^2$ | 1.23456e2 |
123456.0 | 1.23456 * $10^5$ | 1.23456e5 |
0.000023 | 2.3 * $10^{-5}$ | 2.3e-5 |
형식지정자 %e (e소문자로 출력) 혹은 %E (E대문자로 출력) 를 쓰면 지수표기법으로 출력된다.
-실수의 표기법
-실수표기법
3.141592 -> double형
3.141592f -> float형
.3453 ->0.3453 (정수부가 없어도 됨)
234. ->234.0 (소수부가 없어도 됨)
-지수표기형
1.23456e4 -> 12345.6
-고정 소수점 방식
전체가 float(32bit)일 때 정수부 16비트, 소수부 16비트 할당
->공학, 과학에 필요한 아주 큰 수를 유연하게 다루기 어려움(직관적이나 유연하지않음)
-부동 소수점 방식
float 기준 부호비트(1bit)/ 가수부분(23bit)/ 지수부분 (8비트)로 표현할 수 있는 범위가 대폭 늘어남
float 외에 double(64bit)로 사용한다면 표현할 수 있는 가수,지수부분이 더 늘어남
예를 들어, 컴퓨터에서 부동소수점 방식으로 6.5를 입력하려고 한다면,
6.5$_{10}$을 2진수로 바꾸어 $+110.1_2$로 만들어준 다음,
정규화하여 $+110.1_2$를 $+1.101_2×2^2$로 바꿔준다.
결과적으로 부호: 양수(0$_2$), 유효숫자 : 1101$_2$, 지수 : 2승(129$_{10}$ = 10000001$_2$)로 나타내어진다.
추가적으로, 지수가 왜 저렇게 표현되는지 궁금하다면 아래의 그림을 참고하자.
그렇다면 float와 double형의 유효숫자(나타낼 수 있는 자리수)는 얼마일까?
float의 경우, 가수부분이 23비트 이므로
23bit = $2^{23}$ ->log$_{10} 2^{23}$ = 6.923... ->10진수에서 유효숫자가 6자리이다
double의 경우 가수부분이 52비트이므로
52bit = $2^{52}$ ->log$_{10} 2^{52}$ = 15.653... ->10진수에서 유효숫자가 15자리이다
6자리를 보고 이런 생각이 드는것이 당연하다.
실수형 변수를 출력했을 때 소수 아랫자리가 6자리로 나오는 것과 연관이 있는것인지 말이다.
당연히 옳은 생각이다. 위의 계산에 의해서, 실수의 유효숫자가 6자리이므로, 실수형은 x.xxxxxx형태로 나타난다.
-정리
정리하자면,
실수형의 종류는 이러하며(long double은 사실 10byte이지만, windows 계열이나 여러OS들에서 8byte로 취급한다.)
부동소수점 방식에 따라 유효숫자는 이러하다.
2. 형변환
형변환(type cast)이란, 연산 시에 데이터의 유형이 변환되는 것이다.
형변환의 종류에는 자동 형변환과 명시적 형변환이 있다.
-자동 형 변환
자료형이 자동 변경되는 자동 형 변환에는 대입 연산 시 형변환이 있는데,
만약 double형태의 변수에 정수를 저장하려 한다면, 자동으로 정수를 double(실수)형태로 바꿔주는 것이 한 예이다.
반대로 int형태의 변수에 실수형의 자료를 저장하려 한다면, 소수점 부분을 모두 지워 int(정수)형으로 바꿔준다.
또한 자동 형 변환에는 수식에서의 자동 형변환이 있는데, 서로 다른 자료형이 혼합되어 계산되는 경우, 더 큰 자료형으로 통합된다.
예를 들어, int(정수)형과 double(실수)형을 연산할 때, double형으로 통합되는 경우가 있다.
-명시적 형변환
명시적 형변환이란, 사용자가 데이터 타입을 변경하는 것이다.
(자료형) 상수 또는 변수; 로 변경한다.
ex)
(int) 1.23456 //상수
(double) x // 변수
(long) x+1 //수식
주의해야할 점은, 변수나 수식을 형변환했을 때, 형변환한 내용만 형변환되는 것이며 변수 자체의 자료형은 그대로라는 것이다.
int x = 1;
printf("%f\n", (float)x);
printf("%d\n", x);
>>>
1.0
1 //변수 x 속의 내용은 변하지 않음
'CS > C언어' 카테고리의 다른 글
[C언어] 4(2) - 연산자(2) - 비트연산자, 연산자 우선순위 (0) | 2024.06.05 |
---|---|
[C언어] 4. 연산자(1) - 산술, 대입, 복합대입, 증감, 관계/논리, 조건 (0) | 2024.06.04 |
[C언어] 3. 자료형(1) - 정수, 상수, 문자 (0) | 2024.06.03 |
[C언어] 2. 변수와 자료형 기초(2) (0) | 2024.06.03 |
[C언어] 2. 변수와 자료형 기초(1) (0) | 2024.06.03 |