스터디/도서-자바스크립트는 왜 그 모양일까?

스터디 - 자바스크립트는 왜 그 모양일까 / 3장 - 큰 정수

DevGreeny 2022. 12. 19. 21:44

3장 - 큰 정수..
이번 장은 사실 다같이 보면서 무슨 말인 지 이해를 못 한 부분이야
그래서 다들 3장의 나머지 부분은 건너뛰고 다음 시간부터 6장을 보는 게 낫다고 판단했어..
그와중에 3장도 끝까지 한 번 보겠다는 분도 계셨고 짱짱맨bb
큰 정수가 이렇게 심오한 세계일 줄이야..게다가 작가님은
큰 정수를 계산하는 법들을 한 데 모아서 라이브러리까지 만드셨지뭐야 대단하셔

큰 정수

자바스크립트에 대한 불만 - 64비트 정수가 없다.


64비트(int64형)?

  • 최대 9223372036854775807까지 정수를 담을 수 있다.
  • 다른 언어들은 숫자형을 여러 개 가지고 있다.
  • 왜 자바스크립트는 다른 언어와 비슷해서는 안 될까?
    why? 단순성을 잃게 되고, 잠재적 다른 버그를 초대할 가능성 커짐.

==> 모든 자료형 선언과 자료형 변환은 잠재적인 오류

큰 정수는 언어에 내장되어있다.

  • 언어를 사용하는 대부분의 사용자는 큰 정수를 사용하지 x
  • 큰 정수는 현재의 숫자형으로 풀 수 없다는 게 큰 문제.

자바스크립트는 큰 연산 가능

설명: 

- 큰 정수는 배열 형태로 저장. 
- 배열은 그 크기가 자유로워 좋은 선택.
- 각 문자가 부호 없는 16비트 정수로 취급되는 문자열도 좋은 선택.
- 배열의 각 요소는 큰 정수의 일부 비트애 해당하는 값 가짐.

Point. 배열의 각 요소별로 얼마나 많은 비트를 사용할 것인가.

  • 각 요소의 크기가 32비트보다 크다면 비트 단위 연산자를 사용할 수 없고 구현이 훨씬 복잡해짐.
  • 큰 정수에 대한 곱하기, 나누기 => js곱하기 연산자 사용.
  • 이 연산자는 53비트 내에서만 그 결과가 정확함.(배열 요소의 크기가 53비트의 절반이상 x)

=> 그래서 24비트를 선택. 24비트 단위는 메가디지트(megadigit)

메가 디지트(megadigit)

  • 부호를 표시할 수 있는 크기 표현 방식
    배열의 0번 요소는 숫자의 부호: +(플러스) 또는 -(마이너스)값
    배열의 1번 요소는 숫자의 최하위 메가디지트를 담음.
    마지막 요소는 최상위 유효숫자 메가디지트를 담음.

ex ) 9000000000000000000 = ["+", 8650752, 7098594, 31974]

큰 정수 시스템의 내부 기능 쉽게 구현하기

  1. 몇 개의 상수와 함수를 정의
const radix = 167777216; 
const radix_squared = radix * radix; 
const log2_radix = 24; const plus = "+"; 
const minus = "-"; 
const sign = 0; 
const least = 1;

function last(array){  
return array[array.length - 1];  
}

function next_to_last(array){  
return arry[array.length - 2];  
}

큰 정수인지와 부호가 무엇인지 판별할 수 있는 술어함수도 있어야 함.

(술어함수 : 그 반환 값이 불(boolean)값, 즉 참 또는 거짓인 함수)

mint를 적용해서 큰 정수 값을 얻을 수 있음.

  • mint 함수는 배열의 마짐가 요소가 영(0)인 경우 제거.(윗자리 영(0)은 필요없는 숫자.)
  • 배열의 뒷쪽에 있는 요소들은 실제 값에서 높은 자릿수에 있음.
  • 상수 중에 일치하는 값이 있다면 상수로 바꿔줌.
  • 더 이상 바꿀 것이 없으면 배열을 동결(freeze).

mint 함수 : 처음 나타나는 영(0)삭제, 가능한 알려진 상수 값으로 대체.
  • eq함수 : 두 큰 정수가 동일한 값을 가지는 지 확인.
  • abs_It(absolute less than)함수 : 큰 정수의 절댓값이 다른 큰 정수 절댓값보다 작은 지 판별.
  • It(less than) 함수 : 부호를 포함한 값이 다른 정수 값보다 작은 지 판별.
  • reduce함수 : 길이가 같은 경우 큰 정수 배열을 반대로 탐색.