딥다이브스터디 28,29,30 (Number, Math, Date)

김영현·2023년 11월 5일
0

Number

표준빌트인 객체중 하나여서 new연산자와 함께 호출 하면 인스턴스를 생성한다.
값 없이 호출하면 내부슬롯 [[NumberData]]0을 할당하여 래퍼객체 생성함.

참고로 숫자가 아닌 값을 전달하면 강제형변환이 이루어진다.

const num = new Number("10");
num // [[NumberData]] : 10

메서드부분은 열거하며 적을 필요는 없어보인다.
단, 책에 나와있지 않지만 부동 소수점개념에 대해서는 잘 알 필요가 있다.

부동소수점

  1. floting point: 부동소수점(떠돌이 소수점). 실수를 컴퓨터상에서 표현할때 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것.
  2. 이진수에서는 십진법의 소수가 정확히 표현되지 않고 근사치로표현 된다.
  3. 숫자는 보통 4byte(32bit) 공간에 저장된다.
  4. 부호부 (1비트) : 양수일 때는 0, 음수일 때는 1
    지수부 (부호가 없는 정수, 8비트) : 8비트로 표시
    정규화된 가수부 (부호가 없는 정수, 23비트) : 제일 앞의 비트는 정규화되었으므로 1이다.

위의 내용을 안다고 가정하며, 10진수(21.8125)를 2진수로 바꾸어보겠다.

  1. 양수이므로 부호부의 비트가 0이다.
  2. 소수점 위의 21을 2진법으로 나타내면 10101이다.
  3. 소수를 2진법으로 나타내는 방법은 2를 곱하여 정수부분을 취함.
    0.8125*2=> 1.625니까 1 저장
    0.625*2 => 1.25니까 1 저장
    0.25*2 => 0.5니까 0저장
    0.5*2 => 1이니까 1저장 후 끝.
    따라서 소수부분은 0.1101이다.
  4. 이를 정규화하면 0.101011101×2^5이고 지수 5를 2진법으로 바꾸면 101이다.
  5. 따라서 양수부호 0 ,지수부호양수0 , 지수부 000101(8비트로 표시하니, 남은6비트를 사용한다), 가수부 101011101000…
  6. 따라서 00000010110101110100000000000000가 된다.

여기까지 따라왔다면, 문제점을 발견할 수 있다. 0.1을 2진수로 변환해보겠다.

  1. 양수이므로 부호부의 비트 0
  2. 소수점위의 00
  3. 소수를 2진법으로
    0.1*2 => 0.2니까 0
    0.2*2 => 0.4이니까 0
    0.4*2 => 0.8이니까 0
    0.8*2 => 1.6이니까 1
    0.6*2 => 1.2이니까 1
    0.2*2 => 0.4이니까 0....여기서부터 반복된다.

이게 바로 부동소수점의 정밀도 문제다. 10진법 소수를 2진법 소수로 변경할때 무한소수가 필연적으로 발생하므로...
=> 10진법으로 1/3을 정확히 표현할 수 없는 이유와 비슷하다

공간이 유한한 메모리에 집어넣는 순간 이후값은 잘리는 현상이 발생한다.
이를 잘라내는 방식이 몇가지 존재하는데...궁금하면 나중에 알아보자.

아무튼 이런 방식으로 값을 저장하기에 0.1은 사실 0.1이 아니게된다.

만약 금융권이나 소수점이 굉장히 중요한 업계에 다닌다면, 큰 문제로 이어질수도있다.
이를 예방하는 방법은 의외로 간단하다.
10의 제곱을 곱해 소수부를 아예 없애버리고 나중에 연산을 하던지
아니면 메모리의 크기를 늘려 오차범위를 줄이던지(long double)

항상 뭐든지 알고 쓰는게 중요하다.
CS지식도 항상 옳다!!!


Math

표준 빌트인 객체지만 생성자함수는 아니다.
=> 정적 프로퍼티와 메서드(static)만 제공한다.

다 알고있는 메서드니 넘어가도록 하였다...


Date


Date()로 선언하면 객체 대신 문자열로 나온다.
요정도 차이?

나머지는 자세하게 여기에서...

profile
모르는 것을 모른다고 하기

0개의 댓글