// short int 형은 -32768 ~ 32767 까지를 저장할 수 있다.// 최대값인 32767을 이진수로 표현하면 0111111111111111SHRT_MAX=(이진수)=>0111111111111111// 그런데 여기에 1을 더하면 1000000000000000 이 되면서// 10진수로 -32768 가 되어버린다.SHRT_MAX0111111111111111+숫자10000000000000001------------------------------1000000000000000(10진수로-32768)// 비슷하게 최소값 -32768 은 1000000000000000 이며,// 여기서 1을 빼면 되면서 0111111111111111 즉, 10진수로 32767이 된다. SHRT_MIN1000000000000000-숫자10000000000000001------------------------------0111111111111111(10진수로32767)
계산 결과의 절대값이 해당 데이터 타입이 표현할 수 있는 0에 가장 가까운 양수값보다 더 작아져서 값을 제대로 표현하지 못하는 현상.
실수형 연산에서 사용되는 용어
언더플로가 발생하면 담기는 값이 0.0 으로 처리될 수 있다.
데이터 타입의 표현 범위를 벗어났지만, 0.0이 되지 않는 “비정규 값 영역”도 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 양의 float형이 표현할 수 있는 가장 작은 수 FLT_MINfloatflt_min=FLT_MIN;printf("\n%e\n",flt_min);------------------------------>>1.175494e-38// float이 표현할 수 있는 가장 작은 양수값보다 작은 양수값을 저장하면 0.0으로 처리됨floatflush_to_zero=FLT_MIN*1.0e-8;printf("%e\n",flush_to_zero);------------------------------>>0.000000e+00// 하지만 정밀도보다 더 작아도 0.0이 되지 않는 실수 범위도 있다.// 이를 "비정규 값 영역"이라고 하며,// 정밀도를 조금씩 희생하면서 0에 더 가까운 값을 표현하려고 시도하는 영역을 뜻한다. floatjust_before_flush_to_zero=FLT_MIN*1.0e-7;printf("%e\n",just_before_flush_to_zero);------------------------------>>1.401298e-45
(3) 정밀도 손실 loss of precision
자료형이 표현할 수 있는 유효숫자(가수부)의 정밀도보다 더 정밀한 값을 입력받거나 연산했을 때, 초과하는 값이 버려지거나 반올림되어 원래의 정밀도를 잃는 현상 (반올림 오차).
정밀도 손실이 일어나는 이유는 아래와 같다.
1
2
3
4
5
6
/*
float형은 숫자를 c * 2^q 형태로 저장한다.
숫자를 전부 저장하지 않고, 앞부분의몇 자리(유효숫자)와 크기(지수)만 저장하는 것이다.
바꿔 말하면, float 형은 10진수 기준 7자리정도만 정확하게 기억할 수 있다.
그걸 넘어선 자리의 숫자는 반올림되거나, 아예 무시될 수도 있다.
*/
Comments