일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬
- SQL
- 머신러닝
- 자바스크립트심화
- 디버깅
- 중학1-1
- c언어
- 자바
- html/css
- JSP
- CSS
- 딥러닝
- rnn
- 컴퓨터구조
- 데이터베이스
- 정보처리기사실기
- 상속
- 중학수학
- 혼공머신
- 정보처리기사필기
- 순환신경망
- 연습문제
- 오블완
- 자바스크립트
- 자바 실습
- JSP/Servlet
- JDBC
- 티스토리챌린지
- 컴퓨터비전
- 데이터분석
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
데이터 처리 2 : 부동 소수점수와 C++ 산술 연산자 본문
앞선 포스트에서 C++의 정수형에 대해서 살펴보았다. 이제 C++의 두 번째 기본 데이터형인 부동 소수점형에 대해서 학습해 볼 것이다. 부동 소수점형은 0.56과 같이 소수부가 있는 수를 나타낼 수 있다.
또한 매우 큰 값들을 나타낼 수 있다. 그럼 이어서 바로 학습해보자!
3. 부동 소수점수
부동 소수점수의 표기
부동 소수점수를 표기하는 방법은 두 가지가 있다.
- 일상생활에서 늘 사용하는 소수점 표기법
- 3.45E6과 같이 지수 표기를 사용
E6은 10의 6 제곱을 의미하므로 3.45E6은 3,450,000이 된다. 여기서 6을 지 수, 3.45를 가수라 한다.
부동 소수점수의 지수 표기는 매우 큰 수나 매우 작은 수를 나타내는데 유용하다.
부동 소수점형
C++에는 float, double, long double의 세 가지 부동 소수점형이 있다. 이 데이터형들은 유효 숫자의 개수와 지수의 최소 허용 범위가 다르다.
예제 8번 : floatnum.cpp
지난번과 똑같이 풀었는데 이상하게도 이번에는 오류가 떠서 빌드가 잘 안 되었다. 쓰기용 오류가 발생하는데 할 때마다 성가셔서 이 문제를 해결해야 할 것 같다.
프로그램 분석
일반적으로 cout은 뒤에 붙은 0을 출력하지 않는다. 그러나 cout.setf()를 호출하면 이 행동이 무시된다. 여기서 cout은 소수점 아래 6자리까지 출력하므로 0도 함께 출력된다.
부동 소수점수의 장단점
부동 소수점수는 정수에 비해 2가지 장점을 가진다.
- 정수와 정수 사이에 있는 값을 나타낼 수 있다
- 스케일을 사용하여 매우 큰 범위의 값을 나타낼 수 있다
예제 9번 : fltadd.cpp
어떤 수에 1을 더한 후 원래의 수를 뺀다. 예상되는 결과는 1이어야 한다. 하지만 0이 되었다. 이는 2.34E+22f가 소수점 위로 23개의 숫자를 가진 큰 수이기 때문이다. 이 수에 1을 더하는 것은 23번째 숫자에 1을 더하는 것과 같다.
float형은 처음 6개나 7개의 숫자까지만 나타낼 수 있으므로, 23번째 숫자에 1을 더하는 것은 아무런 효과도 갖지 못한다.
4. C++ 산술 연산자
연산자와 피연산자가 결합되어 수식을 구성한다. 상수뿐 아니라 변수도 피연산자로 사용할 수 있다.
예제 10번 : arith.cpp
연산 순서 : 우선순위와 결합 방향
C++에는 하나의 피연산자에 하나 이상의 연산자가 걸렸을 때 어느 연산자를 먼저 적용할 것인지 결정하는 우선순위 규칙이라는 것이 있다.
연산자들의 결합 방향이 왼쪽에서 오른쪽인지 또는 오른쪽에서 왼쪽인지를 나타내는 결합 방향규칙을 적용한다. 왼쪽 -> 오른쪽이면 왼쪽에 있는 연산자를, 그 반대의 경우는 오른쪽 연산자를 먼저 적용한다.
예제 11번 : devide.cpp
예제 12번 : modulus.cpp
데이터형 변환
데이터 불일치를 해결하기 위해 다음가 같은 상황에서 자동으로 변환을 수행한다.
- 특정 데이터형의 변수에 다른 데이터형의 값을 대입했을 때
- 수식에 데이터형을 혼합하여 사용했을 때
- 함수에 매개변수를 전달할 때
범위가 작은 데이터형의 값을 범위가 큰 데이터형에 대입하는 것은 젼혀 문제가 되지 않는다. 그러나 큰 long형의 값을 float형 변수에 대입하면 정밀도가 손실된다.
부동 소수점수를 정수형에 대입할 때는 두 가지 문제가 발생한다.
- 소수부를 버린다
- float형 값이 너무 클 경우 int형 변수에 온전히 들어갈 수 없다
예제 13번 : init.cpp
C++에서는 부동 소수점형을 정수형으로 변환할 때 소수부를 반올림하지 않고 매정하게 잘라버린다.
수식에서의 데이터형 변환
수식에 여러 가지 데이터형을 혼합해서 사용하면 어떤 일이 벌어지는가?
이 경우 두 종류의 자동 데이터형 변환을 수행한다.
- 어떤 데이터형은 나타날 때마다 자동으로 데이터형이 변환된다
- 다른 데이터형과 혼합하여 사용되었을 때 데이터형이 변환된다
정상 승급이 되는 경우가 몇 가지 있는데 이것까지 정리하면 분량이 너무 많은 것 같아 생략한다.
데이터형 변환자
데이터형 변환자를 사용하여 강제로 데이터형을 변환시킬 수 있다.
예제 14번 : typecast.cpp
데이터형 변환자를 사용하는 2가지 이유
- double형으로 저장하지만 int형으로 계산해야 하는 값들에 사용된다
- 특정 목적에 맞게 강제로 데이터형을 변환한다
학습을 마치고
부동 소수점형은 정수형에 비해 어렵다고 생각했는데, 이것도 전보다는 더 친근하게 느껴졌다. 형 변환이 필요한 이유에 대해서도 잘 알게 되었고 분량이 많지만 데이터 처리 부분은 정말 중요하다.
이제 연습 문제를 풀며 단원을 마무리하고자 한다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
복합 데이터형 1 : 배열과 문자열 (0) | 2024.08.25 |
---|---|
데이터 처리 3 : 단원 연습문제 풀기 (0) | 2024.08.25 |
데이터 처리 1 : 간단한 변수와 const 제한자 (0) | 2024.08.25 |
C++ 시작하기 3 : 단원 연습문제 풀기 (1) | 2024.08.25 |
C++ 시작하기 2 : C++ 기타 구문과 함수 (0) | 2024.08.25 |