0x01강-기초 코드 작성 요령 1

공간복잡도 512mb=1.2억개의 int를 잡을 수 있다고 기억하자. 

 

언사인드 케릭터 에서는 제일 왼쪽이 자연스럽게 2^7이지만  char에서는 제일 왼쪽이 독특하게 -2^7이다. 

정수 자료형에는 char 말고도 short, int, long long 자료형이 있다. (c++ 기준)

 

커지는 순서로는

char <short< int < long long

1byte<2byte<4byte<8byte 순서이다. 

최대숫자로는 지수 표현으로

2^7-1 ( 127) < 2^15-1 (32767) < 2^31-1 (≒2.1x 10^9  대략 21억) < 2^63-1(≒9.2x 10^18 ) 이다. 

 

메이플 최대매소 2,147,483,647은 

2^31-1의 값이다. 

 

80번째 피보나치 수를 표현하는 것 같이 int 범위를 넘어서는 수의 경우의 저장은 반드시 long long 자료형을 사용해야 한다. 

 

 

----------------

10^9가 10억이고, 10^10이 100억이라 

10^9까지는 int로 처리가능한데 거기서10을 곱해서 10^10되버리면 int가 담을 수 있는 값인 대략 21억( 정확히 2^32-1)을 넘어서기 때문에 integer overflow가 발생한다. 

 

 

 

 

실수 자료형에는 float( 4byte) 와 double (8byte)가 있다. 

2진수에서의 무한소수의 표현

 

 

2진수에서의 과학적 표기방법

 

 

 

 

반드시 주의해야할 사항은 실수의 저장/연산 과정에서 반드시 오차가 발생할 수  밖에 없다는 것이다. 

 

이런 일이 발생하는 이유는 실수를 저장하는 부분인 fraction 부분이, float은 23bit, double은 52bit 까지만 잘라서 저장하기 때문이다. 

 

안전한 범위를 보면 float은 유효숫자 6자리이고, double은 유효숫자 15자리이기 때문에

float은 상대오차 10^-6까지 안전하고, double은 10^-15까지 안전하다는 소리이다. 

 

상대 오차의 허용 범위에서 볼 수 있듯 두 자료형끼리 차이가 굉장히 크기 때문에 

실수 자료형이 필요하면 꼭 float 대신 double을 써야 한다. 

알고리즘 문제를 풀면서 실수를 다룰때 double 대신 float을 사용해야 하는 상황을 경험하기란 만나기 쉽지 않을것이다. 

 

<double에 long long 범위의 정수를 함부로 담으면 안됀다>

다만 int는 최대 21억이기 때문에 double에 담아도 오차가 생기지 않는다. 

 

<실수를 비교할때는 등호를 사용하면 안된다>

실수를 비교하고 싶다면, 아주 작은 값만큼의 차이를 내는지를 통해서 표현해야 한다. 

1e-12같은 수를 이용해서 차이값이 아주 작음을 나타내야 한다. 

10^-12가 1e-12로 표현 할 수 있다 (c++) 

10^9를 표현하고 싶으면? 1e9 로 표현하면 된다. 

그리고 10^9는 10억이다. 

int로 표현할 수 있는 수는 21억이고. 

 

지금 얘기하고 있는건 것들은 IEEE-754 소수 표현법에서의 얘기이다. 

 

'알고리즘 > BOJ' 카테고리의 다른 글

0x06강 큐  (0) 2023.02.02
0x05강 스택  (0) 2023.02.01
0x04강-연결리스트  (0) 2023.01.28
0x03강 - 배열  (0) 2023.01.26
0x02강-기초 코드 작성 요령2  (0) 2023.01.25
  Comments,     Trackbacks