본문 바로가기
기계공학부 시절의 기록/C++일기

2.3 ~ 2.5 고정너비정수, void, double, 절단오차

by juhyeonglee 2021. 5. 5.
728x90
반응형

 

제가 빠르게 복기하기 좋게 정리한 글입니다. 파일을 추가하는 세세한 방법과 과정은 마지막에 첨부된 영상으로 확인하시면 좋을 것 같습니다 :) 강의목차의 번호와 같은  목차번호를 사용하고 있으니 참고하세요!

 


 

 

 

2.3 고정너비 정수

플랫폼, 컴파일러에 따라서 자료형에 할당되는 메모리가 조금씩 다를 수 있다.

하지만 이러한 불확실한 점은 개발자에게 있어서 불안하다.

C++11부터는 고정적인 너비를 정하여 이러한 불확실성을 없애는 기능을 넣었다.

 

아직 쓸일은 잘 없고 이런게 있다~ 정도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main()
{
    //16_t : 16 bits
    std::int16_t i(5);
 
    // integer가 아닌 char
    std::int8_t myint = 65;
 
    std::int_fast8_t fi(5); 
    std::int_fast64_t fl(5);
 
    std::cout << i << std::endl// A 
    std::cout << myint << std::endl;
    std::cout << fi << std::endl;
    std::cout << fl << std::endl;
 
    return 0;
}
cs

 

2.4 void

void는 비어있음을 의미한다. 이런 void 의외로 쓰임이 많다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
// 입출력이 따로 없이 기능수행만 하는 경우
// 출력자료형이 없음을 void로 기술해줘야
void myfunc()
{
 
}
 
int main()
{
    using namespace std;
 
    // void는 메모리를 차지하지 않는다.
    // 변수선언이 불가하다.
    //void myvoid;
 
 
    // 포인터는 할당메모리의 가장 첫번째 메모리 주소만 
    // 나타낸다. 즉, 메모리크기가 달라도 주소를 나타내는
    // 형식은 동일하다.
 
    // 각 4 bytes, 8 bytes의 자료형 정의
    int i = 123;
    double d = 123.123;
 
    //사이즈 측정
    cout << sizeof(i) << endl;
    cout << sizeof(d) << endl;      
    
    
    //자료형이 정해지지 않은 메모리공간(주소) 생성
//void my_void; 는 되지 않음
    void* myvoid;
 
    myvoid = (void*)&i;
    std::cout << myvoid << std::endl;
    myvoid = (void*)&d;
    std::cout << myvoid << std::endl;
 
    return 0;
}
 
cs

데이터 타입이 다르고 타입의 사이즈가 다르더라도, 데이터의 주소를 표현하는 데이터양은 동일하다.

이를 이용해서 void*로 저료형이 정해지지 않은 주소를 생성하고 이를 int형 주소로 변환하거나, float형 주소로 변환하여 사용함. 

 

아무튼 void가 포인터를 쓸 때 많이 쓰인다.

 

 

 

 

2.5 floating point number : 소수점

 

표현가능한 가장 큰 수, 작은 수

이 때 느껴야 할 점은, double는 float가 차지하는 메모리는 2배이고 이는 컴퓨터에게 큰 차이라는 것.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <limits>
 
int main()
{
    using namespace std;
 
    float f;
    double d;
    long double ld;
 
    // max : 표현할 수 있는 가장 큰 수
    // min : 표현할 수 있는 가장 작은 절댓값
    // lowest : 표현할 수 있는 가장 작은 수
    cout << numeric_limits<float>::lowest() << endl;
    cout << numeric_limits<double>::lowest() << endl;
    cout << numeric_limits<long double>::lowest() << endl;
 
    return 0;
}
 
cs

 

e의 활용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
include <iostream>
 
int main()
{
    using namespace std;
 
    float f(3.14);
 
    cout << 3.14 << endl;
    cout << 31.4e-1 << endl;
    cout << 31.4e-2 << endl;
    cout << 31.4e1 << endl;
    cout << 31.4e2 << endl;   
 
    
    return 0;
}
 
cs

 

실수계산, 절단오차

1/3을 그냥 출력하면 유효숫자 6개로 뒤의 소수점들이 절단되어 나오지만

앞에 setprecision(유효숫자개수)를 출력시키고 진행하면 해당 유효숫자만큼의 수를 출력한다.

 

setprecision을 이용하면 덧셈에서 나타나는 절단오차의 누적오차를 확인할 수 있다.

 

 

 

<cmath> 라이브러리의 isinf, isnan을 이용해 무한대인지, 수가 아닌지를 bool 자료형으로 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <iomanip> // setprecision 함수를 쓰기 위한 라이브러리
#include <cmath>
 
int main()
{
    using namespace std;
 
    double z = 0.0;
 
    double posinf = 5.0 / z;
    double neginf = -5.0 / z;
    double nan = z / z;
 
    // true : 1   false : 0
    cout << posinf << " " << std::isinf(posinf) << endl;
    cout << neginf << " " << std::isinf(neginf) << endl;
    cout << nan << " " << std::isnan(nan) << endl;
    cout << 1.0 << " " << std::isnan(1.0<< endl;
    
 
    return 0;
}
 
cs

 

 

출처)

홍정모의 따배씨++

 

www.youtube.com/watch?v=TA82U984UTE&t=616s

 

좋은 강의에 너무나 감사하다.

이전에는 그냥 무작정 따라썼던 코드들을 한줄한줄 이해하며 공부할 수 있다.

언젠가 어느 언어든 자신감이 있는 코드마스터가 될 것이다.

 

데이터가 인간을 대신해 일을 하게하고

데이터를 제어해 로봇을 제어하고 싶다.

 

수많은 데이터가 넘실대는 현대에서는 데이터를 자유자재로 다루는 프로그래머.

실력있는 프로그래머가 되기 위해서는 코드 한줄이 내부적으로 어떻게 작동되는지를 이해해야한다.

728x90
반응형

'기계공학부 시절의 기록 > C++일기' 카테고리의 다른 글

2.7 문자형 char  (0) 2021.05.06
2.6 불리언 자료형  (0) 2021.05.05
2.2 정수형  (0) 2021.05.04
2.1 기본자료형  (0) 2021.05.03
1.12 ~ 1.13 헤더가드가 필요한 이유(LINK ERROR), Namespace  (0) 2021.05.03

댓글