본문 바로가기
공부

복습1 - 정수와 실수

by MY블로그 2022. 11. 8.

정수와 실수는 표현하는 방식 > 메모리를 다루는 방식 자체가 다르다.

ex> 정수의 비트상태 = 00001001 (2진수) 실수는 다르다.

int a = 4 + 4.0 >정수와 실수의더하기일경우 인트자료형이기떄문에 8이되지만 보이지않는 추가과정이더있다.

이러한이유때문에 같은 형태끼리만 가능하면 사용하도록 한다.

 

부동소수점 - 예시

실수는 소수점아래로 무한하게 숫자가 있을수 있기때문에 일정한 지점까지만 표시가 되어야 한다.

이진법의 소수점은 0과 1두가지로 표현이되고 소수점위로는 0,1두개가있어야 다음자리

반대로 소수점 아래로는 2의-1승,소수점두번째자리2의-2승 ... 이 된다.

부호부 1비트 : 양수일때는 0 음수일떄는1 (비트의 제일앞자리이다)

지수부 (부호가있는정수 7비트) : 제일 앞의 1비트는 부호를 정하고 나머지 6피트로 숫자자리를 표시한다.

부동소수점의 표현 방식

제일앞의 비트는 부호/중간비트는 지수(2의 몇승을 알리는)부분/나머지뒷부분은 가수를 나타냄 

아래 나무위키 자료 참고

예시

−118.625 (십진법)을 IEEE 754 (32비트 단정밀도)로 표현해 보자.

  • 음수이므로, 부호부는 1이 된다.
  • 그 다음, 절댓값을 이진법으로 나타내면 1110110.101이 된다. (
  • 소수점을 왼쪽으로 이동시켜, 왼쪽에는 1만 남게 만든다. 예를 들면 1110110.101=1.110110101×2⁶ 과 같다. 이것을 정규화된 부동소수점 수라고 한다.
  • 가수부는 소수점의 오른쪽 부분으로, 부족한 비트 수 부분만큼 0으로 채워 23비트로 만든다. 결과는 11011010100000000000000이 된다.
  • 지수는 6이므로, Bias를 더해야 한다. 32비트 IEEE 754 형식에서는 Bias는 127이므로 6+127 = 133이 된다. 이진법으로 변환하면 10000101이 된다.

이 결과를 정리해서 표시하면 다음과 같다.

실수를 다를때 잘못하는 예시

소수점자리가있는 다양한 실수들을 더해서 정수를 만들어야되는 경우.

정수1을 만들어야되는데 실수들이더해져 0.999999... 처럼 나오는경우가있다.

코드의 조건을 1이나오게 구성하였더라도 결과값이 정확한 1이 나오지 않을수 있다.

실수의 정밀도 개념을 파악해야한다 > 디버깅때 고생한다고함. (현재 정확히 경험해본적이없으니 참고만하자)

 

요점 : 정수표현 방식과 실수 표현 방식은 다르다!

-실수의 표현 방식은 정밀도에 의존한다.

-따라서 double(8바이트) 자료형이 float(4바이트) 보다 더 아래의 소수점까지 정확한 표현이 가능하다.

-정수는 정수끼리 실수는 실수끼리 ! 같은 타입끼리 연산을 시키는게 제일 좋다.

-간혹 두표현 방식의 피 연산자가 연산될 경우 명시적으로 변환하자(의도하게하였다는 것을 확실히표현하자)

ex ) float f = 10.324234f + 20; > (float)20; 으로표기하자

따로 float을 표시안해줘도 프로그램에서 자동적으로 적용도해주지만 가시성을 위하여 표기하면좋다.

 

'공부' 카테고리의 다른 글

[C++] STL 에 대하여  (0) 2022.11.08
복습2 - 연산자  (0) 2022.11.08
C++ Switch 의 특징 추가  (0) 2022.11.02
방위 이름짓기 참고  (0) 2022.10.28
메모리 누수 / 가비지 컬렉션 / 메모리 단편화  (0) 2022.10.28

댓글