3. 부동소수점의 표현 방식

P4·2023년 6월 9일
0
post-thumbnail

int나 long이나 둘 다 4byte임 <-- 이건 int를 너무 오래쓰다보니까 둘다 4byte가 된 케이스임

부동소수점의 표현방식

  • 정수와 실수는 표현되는 방식 자체가 다르다. <-- 만약 정수와 실수가 혼합된다면 컴퓨터는 둘 중 하나의 연산방식을 반드시 택해야함

  • 만약 int a = 4 + 4.0; 이면? <-- 받는 자료형이 int이기 때문에 4.0이 4(정수)로 형변환 되면서 연산됨

  • 정수, 실수가 막 섞여있으면 굉장히 연산이 비효율적으로 변함, 웬만하면 정수는 정수끼리 실수는 실수끼리


21.8125를 이진수로 표현하는 법

  1. 21을 이진수로 표현하면 10101이 됨

  2. 그럼 이제 소수는 어떻게 될까? 0.1부터 보자

  3. 0.1이 10개 모여야 1의 자리로 감, 이진법에서는 2개만 모여도 1의 자리로 감 --> 그렇다면? 이진법에서는 0.5가 됨

  4. 10101.11 <-- 여기서 0.11의 위치에 있는 얘네들은 212^{-1}, 222^{-2} 이렇게 됨 (0.5, 0.25...)

    • 십진법은 10의 제곱만큼 올라가거나 내려가니까 이진법은 당연히 2의 제곱만큼 올라가거나 내려감!
  5. 따라서 21.8125는 이진법으로 10101.11010이 됨

  6. 10.5+10.25+10.0625=0.81251 * 0.5 + 1 * 0.25 + 1 * 0.0625 = 0.8125

  7. 그런데 소수점은 안쓰니까?, 정규화 하면 소수점이 맨 앞으로 감 <-- 이게 무슨소리냐 하면

    • 10101.1101010101.11010을 쭈우우우우욱 내려서 소수점을 맨 앞으로 보내면? 0.1010111010250.1010111010 * 2^5 이게 됨! <-- 5칸 오른쪽으로 밀렸으니까
  1. 저 밀어서 소수점이 된 부분은 가수부, 그리고 2의 5제곱을 나타낸 부분은 지수부가 됨

  2. 지수부는 000101 <-- 맨앞은 부호, 그 뒤는 2의 00101제곱, 그리고 가수부는 그대로 1010111010

  3. 따라서 00000010110101110100000000000000 <-- 0의 개수가 많은건 신경쓸필요 없음, 아마 공간을 많이 할당해준 것 같음

필요한 부분만 떼서 보기 --> 0001011010111010 = 21.8125의 이진수 표현

부호 (양수가 0)지수부 (252^5)가수부
0001011010111010

그럼 만약에 0.7549124 이런 소수를 표현한다면?

  • 아주 근사한 값까지는 도달할 수 있겠지만? 완전히 정확한 수에는 도달하지 못할 수도 있음 (이진법으로 딱 표현이 안된다면) + 표현이 되어도 너무 길게 늘어진다면 공간이 부족해짐 <-- 거기서 오차가 발생함

  • 이것때문에 발생하는 문제는 if문 등을 쓸때 1 + 0.1 == 1.1 이런게 False로 나올 수가 있음 <-- 이런 문제를 최대한 막기위해서는 float은 거르고 double을 사용

  • 정수는 정수끼리, 실수는 실수끼리 연산하되, 두 표현방식의 피 연산자가 혼합 연산될 경우 명시적으로 변환하자 (내가 의도적으로 이렇게 했다는걸 명시)

  • ex) float f = 10.2415f + 20;이면? float f = 10.2415f + (float)20; 이렇게 써주기

profile
지식을 담습니다.

0개의 댓글