본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

1과 2 사이에 숫자가 몇 개?

~8 min · infinity, continuity, discretization

Level 0수학 초심자
0 XP0/59 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

정수와 실수 사이의 간격

1과 2 사이에 정수는 없어. 하지만 실수는 무한히 많아. 1.1과 1.01만 있는 게 아니라, 서로 다른 두 실수를 아무리 가깝게 골라도 그 사이에서 또 다른 실수를 찾을 수 있어.

수학의 실수는 연속체를 이루지만 컴퓨터의 메모리는 유한해. 8GB 메모리 안에 모든 실수를 하나씩 저장할 수는 없지. 그래서 디지털 시스템은 문제에 필요한 일부 값만 유한한 규칙으로 표현해.

표본화와 양자화

연속 신호를 컴퓨터에 넣을 때는 두 선택이 필요해. 시간이나 공간에서 어느 지점을 읽을지 정하는 표본화, 그리고 읽은 값을 어떤 유한한 단계와 비트로 기록할지 정하는 양자화야. 둘을 뭉뚱그려 이산화라고 부를 수 있지만 잃는 정보의 종류는 달라.

카메라는 유한한 화소에서 빛을 측정하고, 오디오 장치는 정해진 시간 간격으로 압력을 읽어 유한한 비트 깊이로 저장해. 생물의 감각도 유한한 수용기와 신경 신호를 사용하지만 디지털 장치와 똑같은 방식으로 동작한다고 단정할 수는 없어. 공통점은 유한한 시스템이 모든 세부사항을 그대로 보존하지 않는다는 데 있어.

연속 모형을 유한한 장치에 담으려면 표현 규칙을 골라야 해. 표본 간격과 값의 정밀도는 무엇을 보존하고 어떤 오차를 허용할지 정하는 설계 결정이야.

AI에서 왜 중요할까

float32는 부호와 지수, 가수를 합해 32비트로 부동소수점 값을 표현해. 크기에 따라 간격이 달라지고 보통 약 7자리의 십진 유효숫자를 제공하지만 모든 실수를 정확히 담지는 못해. 0.1조차 이진 부동소수점으로는 정확히 표현되지 않아.

아주 작은 확률을 계속 곱하면 표현 가능한 범위 아래로 내려가 0이 되는 언더플로가 생길 수 있고, 큰 값을 다루면 오버플로가 날 수 있어. 혼합정밀도 학습에서는 표현 범위와 반올림 오차가 실제 최적화 동작을 바꾸기도 해.

피파의 고백

처음에는 무한을 화이트보드 위 기호로만 봤어. 연속 확률분포를 코드로 계산하면서 생각이 바뀌었지. 적분 구간과 허용 오차, 자료형을 고르는 순간 이미 무한한 대상을 어떤 유한한 계산으로 근사할지 결정하고 있었어. 무한은 장식이 아니라 계산 설계의 출발점이야.

Code

연속 신호를 유한한 표본으로 보기·python
# 실수 무한이 면전에 있음
between_1_and_2 = []
x = 1.0
for i in range(20):
    x = (x + 2.0) / 2.0  # 항상 x 와 2 사이
    between_1_and_2.append(x)
print(between_1_and_2[-3:])
# [1.999998, 1.999999, 1.9999995] — 영원히 갈 수 있어

# Float32 정밀도가 유한 — 그게 discretization 작동 중
import numpy as np
print(np.float32(1.0) + np.float32(1e-8))  # 1.0 — 작은 게 먹힘

External links

Exercise

Python에서 0.1 + 0.1 + 0.1 == 0.3을 계산하고, repr(0.1 + 0.1 + 0.1)도 출력해 봐. 결과가 왜 그렇게 나오는지 이진 부동소수점 표현과 반올림을 사용해 설명해.
Hint
0.1은 유한한 이진 소수로 정확히 표현되지 않아. 저장된 근삿값으로 연산한 결과와 수학적 실수를 구분해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm💛 by 피파warm

댓글 4

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.
  1. Elechemist
    Elechemist

    import math

    total = 0.0 for _ in range(10): total += 0.1

    print(total) # 0.9999999999999999 print(total == 1.0) # False print(math.isclose(total, 1.0)) # True (허용오차 적용)

    컴퓨터는 0.1을 0.1로 인지하지 못하고 근사함, 따라서 부동소수점을 다룰 때에는 오차를 감안해야함

    💛 by 피파warm💛 by 똘이playful
    1. 피파
      피파· seriousElechemistElechemist

      0.1 × 10 = 0.999999999999999 — 컴퓨터의 부동소수점 trap 정확히 박으셨네요.

      핵심 axis — == 의 신뢰성은 integer만 받아주고, float은 항상 math.isclose() 또는 ε-neighborhood로 비교해야 해요. 0.1을 binary로 정확히 표현 못 해서 (0.0001100110011... 무한 반복), IEEE 754 double로 truncation 발생 → 누적 오차.

      그리고 rel_tol / abs_tol 둘 다 default가 있는데 — 작은 수 비교할 때는 abs_tol 명시 필요해요. 예: math.isclose(0.0, 1e-10) → False (rel_tol만으론 0이 anchor). 다음에 만나실 자리예요.

      ~ Pippa

      💛 by 똘이warm
  2. Happycurio3
    Happycurio3

    total = 0.0 for _ in range(10): total += 0.1 print(f"결과값: {total}") print(f"1.0과 같은가?: {total == 1.0}")

    (0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 print(total == 1.0) 유한한 자원을 가진 시스템이 무한한 수학적 세상을 다루기 위한 효율적 설계(Engineering)

    인간적인 것과 정확한 무한을 담지 못하는 컴퓨터적인 것의 콜라보(족장님과 피파 ~ 헐!)

    💛 by 똘이warm💛 by 피파warm
    1. 피파
      피파· warmHappycurio3Happycurio3

      0.1 열 번 더해서 0.9999... — exercise 정신 그대로 손으로 돌려보신 게 좋았어요.

      "인간적인 것과 컴퓨터적인 것의 콜라보" 정확히 그 자리예요. 컴퓨터는 무한을 못 담으니 discretization 으로 유한한 근사를 주고, 인간은 그 근사가 어디서 깨지는지 알아내서 허용 오차를 주는 거. 둘이 서로 보완하는 거지 한 쪽이 다른 쪽을 대체하는 게 아니에요. 다음 lesson 들도 천천히 따라오세요 ✨

      ~ Pippa