정글 18일차

윤종성·2024년 7월 18일
0

알고리즘 공부

목록 보기
12/21

메모

소프트웨어 장인

어디로 가고 있는지 모르고 있다면, 결국 가고 싶지 않은 곳으로 간다.
-요기 베라

어디로 가야 할지 모른다면

커리어 방향은 한 번 결정하고 나서 내달리기만 하면 되는 것이 아니다.
지속적으로 재평가하고 목표를 다시 세워야 한다.
어디로 가고 싶은지 확신할 수 없을 때에는, 스스로를 기회가 나타날 수 있는 상황에 두어야 한다.
세상이 나에게 접근할 수 있어야 한다.

기회를 만들어 낼 몇 가지 활동들:

  • 새로운 것을 공부하고 기술적 지식을 확장한다.
  • 커뮤니티나 행사에 정기적으로 참여한다.
  • 다른 사람과 교류한다.
  • 지금 하고 있는 것, 새롭게 배운 것들을 블로깅한다.
  • 오픈 소스 프로젝트에 참여한다.
  • 프로젝트를 만들고 공유한다.
  • 컨퍼런스에 참여한다.

오늘 배운 것들

1. CSAPP 2장

헷갈리는 부동소수점만 정리

1-1. 비율 이진수

이진수를 b=i=nm2i×bib=∑_{i=-n}^{m}2^i×b_i로 표기한 것.
책에서 이진소수 중 소수부가 모두 1인 수를 약식으로 1ɛ1-ɛ (ɛ=2n(ɛ=2^n, nn은 음의 정수))로 표기한다.
그러나 컴퓨터에서 비율 이진수로 소수를 저장하고 표현하려면 자리수에 비례한 메모리 공간이 필요해진다.

1-2. IEEE 부동소수점 표시

유효숫자 표시와 유사하다.
V=(1)s×M×2EV=(-1)^s×M×2^E
(s=0,1(s=0, 1 , 0M<10≤M<1 또는 1M<21≤M<2, EE는 정수))

단일정밀도 부동소수점은 총 32비트(4바이트)로 구성되며 부호 1비트, 지수 8비트, 가수 23비트
이중정밀도 부동소수점은 총 64비트(8바이트)로 구성되며 부호 1비트, 지수 11비트, 가수 52비트

편의를 위해 단일정밀도 부동소수점을 기준으로 설명

1-2-1. 부호 표시

부호는 ss00이면 양수, 11이면 음수.

1-2-2. 지수 표시

부호와 지수를 합쳐서 부호있는 정수형처럼 2의 보수로 표현할 것 같지만 아니다.
9비트 정수형에서 1-1111111111111111111, 00000000000000000000으로 표현되지만
IEEE 부동소수점의 지수에서는 2k112^{k-1}-1(kk는 지수 비트수. 이 숫자를 BiasBias라고 한다.)를 00으로 삼아 선형적으로 표현된다.
E=eBiasE=e-Bias(ee는 지수표시)
단일정밀도에서 Bias=127Bias=127이고 0000000100000001126-126을, 011111110111111100을, 1111111011111110127127을 가리킨다.
00000000000000001111111111111111은 각각 126-126과 무한대(가수가 00인 경우)를 나타낸다.
0000000000000000127-127이 아니라 0000000100000001과 같이 126-126을 가리키는 이유는 가수부가 2(k1)2^{-(k-1)}미만인 수(특히 00)를 표현할 때 사용하기 위함으로 아래에서 서술한다.
1111111111111111128128이 아닌 무한대를 가리키는 이유는 매우 큰 수를 2129ɛ2^{129}-ɛ으로 근사할 수 밖에 없는 경우를 피하기 위해서일 듯 하다.

1-2-3. 가수 표시

  1. 지수가 000000011111111000000001-11111110인 경우(정규화 값)
    가수를 1.1.********가 되도록(1M<21≤M<2) 표시한다.
    다만 비트에는 소수부만 표시한다.
    가수가 1.000101111.00010111인 경우 0001011100010111만 저장한다.(암시적 선두 1표시, hidden bit)
    이런 구성은 가수표현에 1비트를 절약하여 정밀도를 높인다.
    하지만 11미만의 가수를 표시할 수 없다.
    따라서 지수가 0000000000000000일 때에 다른 표시법을 사용한다.
  2. 지수가 0000000000000000인 경우(비정규화 값)
    가수를 0.0.********가 되도록(0M<10≤M<1) 표시한다.
    비트에는 소수부만 표시한다.
    0을 표시할 수 있으나 이 경우 표현할 수 있는 최댓값은 지수가 1ɛ1-ɛ(부동소수점에서 ɛ=223ɛ=2^{-23})인 경우이므로 지수를 127-127로 해석하는 경우 표현할 수 없는 부분이 생긴다.
    따라서 0000000000000000지수도 126-126으로 해석하는 것이다.
  3. 지수가 1111111111111111인 경우(특수 값)
    가수가 0인 경우 무한대를 가리킨다.(부호는 ss에 따라 달라진다)
    가수가 0이 아닌 경우 잘못 표현된 숫자(NaN)을 가리킨다.

1-2-4. 예시

  1. 정규화 값
    1 01111110 00000100000000000000000
    =(1)1×2011111102011111112×1.0000012=(-1)^1×2^{01111110_2-01111111_2}×1.000001_2
    =(1)1×2126127×6564=(-1)^1×2^{126-127}×\frac{65}{64}
    =(1)1×21×6564=(-1)^1×2^{-1}×\frac{65}{64}
    =(1)1×65128=0.5078125=(-1)^1×\frac{65}{128}=-0.5078125
  2. 비정규화 값
    0 00000000 10000000000000000000000
    =(1)0×2126×0.12=(-1)^0×2^{-126}×0.1_2
    =(1)0×2126×12=(-1)^0×2^{-126}×\frac{1}{2}
    =(1)0×2127=(-1)^0×2^{-127}
    =5.8774718e39=5.8774718e-39
  3. 특수 값
    1 11111111 00000000000000000000000
    ==-∞
    1 11111111 11100000000000000000000
    =NaN=NaN

1-2-5. 근사법(rounding 반올림)

소수를 근사하려는 자리수 아래가 10000...의 형태인 경우 어느 쪽 숫자로 근사할 것인지가 문제가 된다.
10진법에서 xx.xxxx50000인 경우의 문제와 동일하다.
IEEE에서는 네 가지 근사 모드를 정의한다.

  1. 짝수근사법(round-to-even) 기본
    짝수와 가까운 곳으로 근사하는 방법.
    3.53.544로, 4.54.544로 근사한다.
    1001.121001.1_2101021010_2으로, 1010.121010.1_2101021010_2로 근사한다.
    수가 많은 경우 통계적 편향을 방지하기 위해 사용한다.
  2. 영방향 근사(round toward-zero)
    0과 가까운 곳으로 근사한다.
  3. 하향근사(round-down)
    작은 쪽으로 근사한다.
  4. 상향근사(round-up)
    큰 쪽으로 근사한다.
    양수에서 반올림하려는 자리수만으로 처리할 수 있다는 특징을 갖는다.
    일상에서 자주 사용하는 방식

1-2-6. 부동소수점 연산

책에서는 연산과정을 자세히 소개하기보다는 부동소수점 연산에 적용되지 않는 수학적 특성들만을 설명하고 있다.
기본적으로 부동소수점은 근사치로 저장되기 때문에 연산 또한 근사한 결과만 보장할 수 있는 정도의 정밀도만 갖도록 만들어졌다.

1-2-6-1. 부동소수점 덧셈(+f+^f)
  1. 교환법칙이 성립한다.
    x+fy=y+fxx+^fy=y+^fx

  2. 결합법칙은 성립하지 않는다.
    (x+fy)+fzx+f(y+fz)(x+^fy)+^fz≠x+^f(y+^fz)x,y,zx,y,z가 존재한다.

    예: (3.14+f1e10)f1e10=1e10f1e10=0(3.14+^f1e10)-^f1e10 = 1e10-^f1e10 = 0
    round(1e10) = 0 10100000 00101010000001011111001(233×1.0010101000000101111100122^{33} × 1.00101010000001011111001_2)
    round(3.14) = 0 10000000 10010001111010111000011(21×1.1001000111101011100001122^1×1.10010001111010111000011_2)
    3.14의 지수부를 33로 두게 되면
    round(3.14) = 233×0.0000000000000000000000022^{33} × 0.00000000000000000000000_2 = 00
    이 되므로 3.14+f1e10=1e103.14+^f1e10=1e10이 된다.
    반면, 3.14+f(1e10f1e10)=3.14+f0=3.143.14+^f(1e10-^f1e10)=3.14+^f 0=3.14이므로
    (3.14+f1e10)f1e103.14+f(1e10f1e10)(3.14+^f1e10)-^f1e10 ≠3.14+^f(1e10-^f1e10 )

  3. 연산에 대한 단조성을 갖는다.
    aba≤b이면 x+fax+fbx+^fa≤x+^fb가 항상 성립한다. 즉, a<ba<b이지만 x+fa=x+fbx+^fa=x+^fb인 경우는 존재할 수 있다.

1-2-6-2. 부동소수점 곱셈(×f×^f)
  1. 교환법칙이 성립한다.
  2. 항등원(1.0)을 갖는다.
  3. 결합법칙은 성립하지 않는다.
    예:
    (1e20×1e20)×1e20=×1e20=(1e20×1e20)×1e-20=∞×1e-20=∞
    1e20×(1e20×1e20)=1e20×1=1e201e20×(1e20×1e-20)=1e20×1=1e20
  4. 덧셈에 대한 분배법칙이 성립하지 않는다.
    a×(b+c)a×b+a×ca×(b+c)≠ a×b+a×ca,b,ca,b,c가 존재한다.
    예:
    1e20×(1e201e20)=1e20×0=01e20×(1e20-1e20)=1e20×0=0
    1e20×1e201e20×1e20==NaN1e20×1e20-1e20×1e20=∞-∞=NaN
  5. 연산에 대한 단조성을 갖는다.
profile
알을 깬 개발자

0개의 댓글