컴퓨터는 어떻게 틀리는가
컴퓨터는 계산을 틀리지 않는다고들 합니다. 실제로는 거의 모든 계산에서 조금씩 틀리고, 그 '조금'이 어떤 조건에서 커지는지 아는 사람이 시뮬레이터를 믿을 만하게 만듭니다. 이 장은 숫자가 비트로 저장되는 방식에서 출발해 뺄셈 한 번이 유효숫자를 날리는 과정, 미분을 차분으로 바꿀 때 생기는 두 종류의 오차, 시간 간격을 조금만 크게 잡아도 시뮬레이션이 폭발하는 이유를 차례로 봅니다. 끝에서는 같은 원리가 이미지 센서 픽셀을 설계하는 전자기 시뮬레이터 FDTD와 RCWA, 그리고 연립방정식의 조건수로 이어지는 것을 확인합니다.
- IEEE 754 배정밀도가 수를 부호·지수·가수로 저장하는 방식을 알고, 0.1 + 0.2 ≠ 0.3의 이유를 비트 수준에서 설명한다.
- 부동소수점 간격이 크기에 비례한다는 것(상대 정밀도 일정)과 기계 엡실론의 의미, AI에서 쓰는 bf16·fp8의 절충을 안다.
- 상쇄 오차를 알아보고 1 − cos x, 근의 공식을 안정적인 형태로 바꿔 쓴다.
- 수치 미분에서 절단 오차와 반올림 오차의 줄다리기(U자 곡선)와 최적 간격 √ε, ∛ε을 설명한다.
- 유한 차분으로 파동 방정식을 풀고 CFL 조건을 직접 깨 본다. FDTD의 Yee 격자, RCWA의 푸리에 전개 개념을 안다.
- 조건수가 입력 오차를 얼마나 키우는지 기하적으로 이해한다.
1991년 2월 25일 걸프전, 사우디아라비아 다란에 배치된 패트리어트 포대가 날아오는 스커드 미사일을 요격하지 못했고, 미사일은 미군 막사에 떨어져 28명이 숨졌습니다. 미국 회계감사원(GAO)의 1992년 보고서가 짚은 원인은 계산 오차였습니다. 시스템 시계는 시간을 0.1초 단위로 세는데, 0.1은 2진수로 끝나지 않는 소수입니다. 24비트 레지스터에 잘려 들어간 0.1은 진짜보다 약 0.000000095초 작았고, 포대가 약 100시간 연속 가동되는 동안 이 오차가 360만 번 쌓여 약 0.34초가 되었습니다. 초속 1.6 km가 넘는 스커드에게 0.34초는 수백 m입니다. 레이더가 다음에 표적을 찾아야 할 '추적 창'이 엉뚱한 곳으로 옮겨 갔고, 시스템은 표적이 없다고 판단했습니다.
수치 오차는 교과서 연습 문제가 아닙니다. 이 장의 도구는 '얼마나 틀릴 수 있는가'를 계산하는 수학입니다.
0.1 + 0.2 ≠ 0.3: 수는 비트로 저장된다
브라우저 콘솔(F12)에 0.1 + 0.2 === 0.3을 입력하면 false가 나옵니다. 0.1 + 0.2의 값은 0.30000000000000004입니다. 파이썬, C, 엑셀도 같습니다. 버그가 아니라 설계입니다. 왜 이렇게 설계했을까요?
10진수에서 1/3 = 0.333…이 끝나지 않듯, 2진수에서는 분모에 2 말고 다른 소인수(예: 5)가 있는 분수가 끝나지 않습니다. 0.1 = 1/10 = 1/(2·5)이므로 2진수로 쓰면 무한 반복 소수입니다.
컴퓨터의 실수형은 대부분 IEEE 754 부동소수점(Floating-point)입니다. 과학적 표기법 \(6.02\times10^{23}\)의 2진 버전으로, 64비트 배정밀도(double, binary64)는 부호 1비트, 지수 11비트, 가수 52비트로 나뉩니다.
아래 시뮬레이터에 아무 수나 넣어 보세요. 입력한 10진수가 아니라 실제로 메모리에 들어간 값을 정확한 10진수로 풀어 보여 줍니다. 2진 유한소수는 언제나 10진 유한소수로 정확히 쓸 수 있으므로(2⁻ᵏ = 5ᵏ/10ᵏ) 이 값은 근사가 아니라 완전한 전개입니다.
배정밀도 해부기: 저장된 값은 정확히 얼마인가
0.1과 0.2는 각각 저장될 때 참값보다 살짝 크게 반올림되고, 둘을 더한 뒤 결과를 다시 53비트로 반올림하면 0.3의 저장값보다 정확히 한 칸 위에 떨어집니다. 그래서 같지 않습니다. 이 '한 칸'의 크기를 단위로 쓰는데, 이것이 ULP(Unit in the Last Place)입니다.
==로 비교하지 않는다. |a − b| ≤ tol·max(|a|,|b|)처럼 상대 허용오차로 비교한다. 돈처럼 10진 단위가 정확해야 하는 값은 정수(원, 센트 단위)나 10진 소수형(Decimal)으로 다룬다.부동소수점 수직선: 간격은 크기에 비례한다
센서 신호는 nV에서 V까지, 거리는 nm에서 km까지 쓰입니다. 고정소수점(소수점 위치 고정)이라면 작은 수는 유효숫자가 거의 없고 큰 수는 넘칩니다. 필요한 것은 '절대 오차'가 아니라 '상대 오차'가 일정한 수 체계입니다.
부동소수점은 지수가 같은 구간 \([2^k, 2^{k+1})\)(한 '옥타브', 이진 구간(binade)) 안에 \(2^{52}\)개의 수를 등간격으로 깝니다. 다음 구간으로 가면 간격이 두 배가 됩니다. 그래서 수직선 위의 점들은 0 근처에 빽빽하고 멀어질수록 듬성듬성하지만, 간격 ÷ 크기는 거의 일정합니다. 그 상대 간격의 상한이 기계 엡실론(Machine Epsilon)입니다.
실제 64비트 수직선은 너무 촘촘해 그릴 수 없으니, 지수와 가수 비트를 몇 개만 쓰는 장난감 형식(미니플로트(minifloat))으로 모든 수를 찍어 봅시다.
미니플로트의 모든 수를 수직선에
가수 비트 M개 형식에서 정수는 \(2^{M+1}\)까지만 빠짐없이 표현됩니다. 그 위에서는 간격이 2 이상이라 홀수가 사라집니다. 단정밀도(가수 23비트)라면 \(2^{24}=16\,777\,216\)이고, 그래서 float32에서는 16777216 + 1 == 16777216입니다. float32 누적 카운터나 누적 합이 어느 순간 더 이상 늘지 않는 버그가 이것입니다. 배정밀도에서는 \(2^{53}\approx9.007\times10^{15}\)이 그 경계입니다.
| 형식 | 지수/가수 비트 | ε (1 다음 수 간격) | 대략 최댓값 | 주 용도 |
|---|---|---|---|---|
| binary64 (double) | 11 / 52 | 2.2×10⁻¹⁶ | 1.8×10³⁰⁸ | 과학 계산, 시뮬레이터, JavaScript의 모든 수 |
| binary32 (float) | 8 / 23 | 1.2×10⁻⁷ | 3.4×10³⁸ | 그래픽스, 신호 처리, 신경망 학습의 기준 |
| binary16 (fp16) | 5 / 10 | 9.8×10⁻⁴ | 65 504 | GPU 추론, 이미지 HDR 저장 |
| bfloat16 (bf16) | 8 / 7 | 7.8×10⁻³ | 3.4×10³⁸ | 신경망 학습: float32와 같은 범위, 정밀도는 포기 |
| fp8 E4M3 / E5M2 | 4 / 3, 5 / 2 | 0.125 / 0.25 | 448 / 57 344 | 대형 모델 학습·추론의 행렬 곱 |
표의 아래쪽으로 갈수록 비트를 아낍니다. 신경망 가중치 하나가 1% 틀려도 수백만 개가 평균되면 결과는 크게 변하지 않지만, 값이 범위를 넘으면(오버플로) 학습이 망가집니다. 그래서 bf16은 가수를 깎고 지수는 float32만큼 남긴 형식입니다. fp8은 더 극단적이어서 텐서마다 배율(scale factor)을 따로 곱해 값을 표현 가능한 범위 한가운데로 옮겨 놓고 씁니다(AIBook 참고). 미니플로트 시뮬레이터에서 E=4, M=3을 놓으면 fp8의 점들이 얼마나 성긴지 보입니다.
패트리어트 계산 다시 하기: 작은 오차가 쌓일 때
이제 첫머리의 사고를 숫자로 재현합니다. GAO 보고서에 따르면 시스템은 0.1초마다 1씩 늘어나는 정수 카운터를 두고, 이를 24비트 고정소수점 레지스터에 담긴 0.1과 곱해 초 단위 시간을 만들었습니다. 저장된 0.1은 2진 소수점 아래 23자리에서 잘린 값이었습니다.
0.1초 시계의 누적 오차
교훈은 두 가지입니다. 첫째, 한 번의 오차가 \(10^{-7}\)이라도 같은 방향으로 백만 번 쌓이면 \(10^{-1}\)이 됩니다. 무작위 반올림 오차는 서로 상쇄되어 \(\sqrt{N}\)으로 자라지만, 잘림처럼 한쪽으로 치우친 오차는 \(N\)으로 자랍니다. 둘째, 같은 시간 값을 일부 루틴은 개선된 변환으로, 일부는 옛 변환으로 계산하면서 두 값의 차이를 쓰는 바람에 오차가 상쇄되지 않았다는 분석도 있습니다(R. Skeel, 1992). 시간처럼 오래 누적되는 양은 정수 틱으로 세고 마지막에 한 번만 변환하는 것이 정석입니다.
상쇄 오차: 비슷한 두 수의 뺄셈
렌즈 처짐(sag), 빛의 경로차, 작은 각도의 위상차를 계산하다 보면 \(1-\cos x\) 같은 식이 자주 나옵니다. \(x = 10^{-8}\)이면 참값은 \(5\times10^{-17}\)인데, 배정밀도로 1 - Math.cos(1e-8)를 계산하면 정확히 0이 나옵니다. 수식은 맞는데 답은 100% 틀렸습니다.
원인은 뺄셈 자체가 아니라 그 전 단계입니다. \(\cos(10^{-8}) = 1 - 5\times10^{-17}\)인데, 1 근처의 간격은 \(\varepsilon\approx2.2\times10^{-16}\)이라 이 값은 저장되는 순간 1로 반올림됩니다. 뺄셈은 그 반올림 오차를 드러낼 뿐입니다. 일반적으로 \(a\approx b\)일 때 \(a-b\)의 상대 오차는
치료법은 대수적으로 같은 식으로 바꿔 뺄셈을 없애는 것입니다.
expm1, log1p, hypot도 같은 목적의 도구다.순진한 식 vs 안정적인 식
Math.fround로 반올림해 흉내 낸다. 오차가 0(완전 일치)이면 그래프 맨 아래에 붙여 그린다.수치 미분의 U자 곡선: h를 줄이면 더 정확해질까
최적화(9장)는 목적함수의 기울기가 필요하지만, 상용 시뮬레이터의 출력은 공식이 아니라 숫자입니다. 가장 쉬운 방법은 \(f'(x)\approx\frac{f(x+h)-f(x)}{h}\)입니다. 극한의 정의대로라면 h를 작게 할수록 정확해져야 합니다. 정말 그럴까요?
테일러 전개(1장)로 오차를 쓰면 두 항이 싸웁니다.
중심 차분 \(\frac{f(x+h)-f(x-h)}{2h}\)은 짝수 차수 항이 상쇄되어 절단 오차가 \(\frac{|f'''|}{6}h^2\)입니다. 반올림 항 \(u|f|/h\)과 균형을 맞추면 \(h^*\sim\sqrt[3]{\varepsilon}\approx6\times10^{-6}\), 오차 \(\sim\varepsilon^{2/3}\approx10^{-11}\)입니다.
미분 오차 vs 간격 h (로그–로그)
유한 차분: 미분방정식을 격자 위의 덧셈으로
칩의 열 분포, 막대의 진동, 공정 중 도펀트 확산은 모두 편미분방정식입니다. 경계 모양이 조금만 복잡해도 손으로 푼 해는 없습니다. 컴퓨터는 덧셈과 곱셈밖에 못 하는데, 미분을 어떻게 시킬까요?
답은 앞 절의 차분을 공간과 시간 양쪽에 쓰는 것입니다. 연속 함수 \(u(x,t)\)를 간격 \(\Delta x,\Delta t\)의 격자점 값 \(u_i^n = u(i\Delta x, n\Delta t)\)으로 바꾸고(6장의 표본화), 도함수를 이웃 값의 가중합으로 근사합니다. 어떤 이웃을 어떤 가중치로 쓰는지 그린 그림을 스텐실(stencil)이라 합니다.
파동 방정식 \(u_{tt} = c^2u_{xx}\)의 양변에 2계 중심 차분을 쓰고 미래 값을 풀면 갱신식이 나옵니다.
여기에 함정이 있습니다. 스텐실은 한 스텝에 이웃 한 칸까지만 봅니다. 그런데 실제 파동은 \(\Delta t\) 동안 \(c\Delta t\)만큼 갑니다. \(c\Delta t > \Delta x\)이면 실제로는 영향을 받아야 할 정보가 격자 알고리즘의 '시야' 밖에 있게 됩니다. 이것이 1928년 쿠랑·프리드리히스·레비가 밝힌 CFL 조건(Courant–Friedrichs–Lewy condition)입니다.
1D 파동 방정식과 CFL 조건
시뮬레이터의 폭발은 폰 노이만 안정성 분석(von Neumann stability analysis)으로 정확히 예측됩니다. 오차를 푸리에 모드 \(e^{ik i\Delta x}\)(5장)로 분해해 한 스텝에 몇 배가 되는지(증폭률 \(\lambda\)) 계산하면, 위 스킴은 \(\lambda^2 - 2(1-2C^2\sin^2\tfrac{k\Delta x}{2})\lambda + 1 = 0\)을 만족합니다. \(C\le1\)이면 모든 k에서 \(|\lambda|=1\)이고, \(C>1\)이면 가장 짧은 파장(\(k\Delta x=\pi\))에서 \(|\lambda|>1\)인 근이 생깁니다. 반올림 오차는 모든 주파수 성분을 조금씩 갖고 있으므로, 증폭되는 모드가 하나라도 있으면 반드시 폭발합니다.
FDTD: 맥스웰 방정식을 격자에서 직접 풀기
스마트폰 이미지 센서의 픽셀은 한 변이 1 µm 안팎으로, 가시광 파장과 비슷합니다. 이 크기에서는 광선 추적이 맞지 않습니다. 마이크로렌즈, 컬러 필터, 금속 격벽, 실리콘 속 깊은 트렌치 격리(DTI)를 지나는 빛의 회절과 간섭을 계산하려면 맥스웰 방정식을 그대로 풀어야 합니다.
1966년 케인 이(Kane Yee)는 유한 차분을 맥스웰 방정식에 쓰는 우아한 방법을 냈습니다. 1차원(\(x\)로 진행하는 \(E_z, H_y\))으로 쓰면 두 방정식이 서로를 갱신합니다.
FDTD(Finite-Difference Time-Domain)도 앞 절의 파동 방정식과 같은 CFL 조건을 따릅니다. 3차원 균일 격자라면 \(c\Delta t\le\Delta x/\sqrt3\)입니다. 또 계산 영역은 유한하므로 바깥으로 나가는 파동이 경계에서 되돌아오지 않게 해야 합니다. 아래 시뮬레이터는 가장 단순한 흡수 경계(1차 무어(Mur) 조건의 특수한 경우)를 쓰고, 실무에서는 경계에 인공 손실층을 두는 PML(Perfectly Matched Layer)을 씁니다.
1D FDTD: 유전체 판에 부딪히는 펄스
FDTD의 장점은 한 번의 시간 영역 계산에 넓은 대역의 펄스를 넣고 푸리에 변환하면 모든 파장의 응답이 한꺼번에 나온다는 것, 구조가 아무리 복잡해도 격자에 재료값만 칠하면 된다는 것입니다. 대가는 계산량입니다. 파장당 10~20칸 이상이 필요하고 3차원이면 격자 수가 세제곱으로 늘어납니다. 그래서 다음 절의 방법이 함께 쓰입니다.
RCWA: 주기 구조는 푸리에 고조파로 푼다
이미지 센서의 픽셀 배열, 반도체 노광 마스크의 라인·스페이스 패턴, 회절 격자, 메타표면은 같은 단위 셀이 주기적으로 반복됩니다. 전체를 FDTD 격자로 덮을 필요가 있을까요? 한 주기만 알면 나머지는 같지 않을까요?
주기 \(\Lambda\)인 구조에 평면파가 들어오면 산란된 장도 같은 주기성(블로흐–플로케 조건)을 가집니다. 그래서 장을 이산적인 방향들의 합으로 쓸 수 있고(5장의 푸리에 급수), 각 방향이 회절 차수(diffraction order)입니다. 방향은 다음 격자 방정식(grating equation)으로 정해집니다.
회절 차수의 방향
격자 방정식은 방향만 알려 줍니다. 각 차수에 에너지가 얼마씩 가는지는 격자 안의 장을 풀어야 합니다. RCWA(Rigorous Coupled-Wave Analysis, 엄밀 결합파 해석)는 이렇게 합니다.
근사는 단 하나, 푸리에 고조파를 유한 개 \(2N+1\)에서 자른다는 것입니다. 고조파를 늘리면 결과가 수렴하고, 실무에서는 N을 키워 가며 회절 효율이 더 변하지 않는 지점을 찾습니다(수렴 시험). 날카로운 금속 모서리처럼 유전율 대비가 큰 구조는 깁스 현상(5장) 때문에 수렴이 느려서, 리(L. Li, 1996)가 정리한 '푸리에 인수분해 규칙'으로 행렬을 만드는 방식이 표준이 되었습니다. 2차원 주기(픽셀 배열)이면 고조파가 \((2N_x+1)(2N_y+1)\)개라 행렬 크기가 빠르게 커지고, 고유값 계산 비용은 그 세제곱에 비례합니다.
| FDTD | RCWA | |
|---|---|---|
| 영역 | 시간 영역, 공간 격자 | 주파수 영역, 푸리에 공간(층별) |
| 잘 맞는 구조 | 임의 모양, 비주기, 비선형 | 주기 구조, 층으로 나눌 수 있는 단면 |
| 한 번의 계산으로 | 넓은 대역(펄스 + 푸리에 변환) | 한 파장·한 입사각 |
| 주된 수치 오차 | 격자 분산, CFL, 경계 반사 | 고조파 절단, 계단 근사 |
| 쓰이는 곳 | 픽셀 광학, 안테나, 나노포토닉스 | 노광 마스크·계측(OCD), 격자, 픽셀 배열 |
조건수: 문제 자체가 오차를 키울 때
공정 계측에서 두 측정값으로 막 두께 두 개를 역산하거나, 색 보정에서 RGB 응답으로 스펙트럼을 추정할 때, 우리는 \(A\mathbf{x}=\mathbf{b}\)를 풉니다. 계산은 완벽하게 했는데 측정 잡음이 조금만 바뀌어도 답이 크게 흔들린다면, 잘못은 알고리즘이 아니라 문제에 있습니다.
2×2 연립방정식은 두 직선의 교점입니다. 측정값 \(\mathbf{b}\)의 오차는 직선을 평행 이동시킵니다. 두 직선이 거의 평행하면 조금만 옮겨도 교점은 멀리 미끄러집니다. 이 증폭률의 최악값이 조건수(Condition Number)입니다.
거의 평행한 두 직선의 교점
조건수는 알고리즘이 아니라 문제의 성질입니다. 어떤 알고리즘도 \(\kappa\cdot u\)보다 정확한 답을 보장할 수 없습니다. 좋은 알고리즘(후방 안정(backward stable), 예: 부분 피벗팅 가우스 소거, QR 분해)은 '조금 다른 문제의 정확한 답'을 주며, 그 이상은 문제를 바꿔야 얻습니다. 유명한 예는 힐베르트 행렬 \(H_{ij}=1/(i+j-1)\)로, 5×5에서 \(\kappa\approx5\times10^{5}\), 10×10에서 \(\kappa\approx1.6\times10^{13}\)입니다. 다항식 피팅에서 \(1, x, x^2,\ldots\)를 기저로 쓰면 이런 행렬이 나오기 때문에, 고차 피팅에는 직교 다항식이나 QR 기반 최소제곱을 씁니다.
이 도구가 쓰이는 곳
시리즈의 다른 책에서 이 장의 도구가 등장하는 곳입니다. 시뮬레이터의 결과를 볼 때 "격자는 충분히 촘촘한가, 시간 간격은 안정 조건 안인가, 고조파는 수렴했는가, 문제의 조건수는 괜찮은가"를 먼저 묻는 습관이 이 장의 목표입니다.
확산·포아송 방정식의 유한 차분/유한 요소, 암시적 시간 적분, 뉴턴 반복과 조건수 OPTICSBOOK파동 광학 시뮬레이션
FDTD, RCWA, 회절 차수와 격자 방정식, 박막 전달 행렬 SENSORBOOK픽셀 광학과 신호 처리
마이크로렌즈·DTI 구조의 FDTD 해석, 다크 프레임 차감의 상쇄, ADC 양자화 LITHOBOOK마스크와 계측
마스크 3D 효과의 RCWA, OCD 계측의 역문제와 조건수 COMPUTERBOOK컴퓨터 산술
IEEE 754 하드웨어, FPU와 융합 곱셈–덧셈(FMA), 정수 오버플로 AIBOOK저정밀도 학습·추론
bf16·fp8, 손실 스케일링, 혼합 정밀도, 자동 미분과 역전파 SOCBOOK고정소수점 DSP
비트 폭 결정, 잘림과 반올림, 누적기 오버플로 MONEYBOOK돈의 계산
금액은 왜 부동소수점이 아닌 정수·10진 소수로 다루는가, 복리의 누적 반올림
핵심 정리
- 부동소수점은 \((-1)^s\times1.f\times2^{e-\text{bias}}\). 0.1처럼 분모에 2 이외의 소인수가 있는 수는 2진수로 끝나지 않아 저장 순간 반올림된다. 그래서 0.1 + 0.2 ≠ 0.3.
- 표현 가능한 수의 간격은 크기에 비례하고 상대 오차는 \(u=\varepsilon/2\) 이하다(배정밀도 \(\varepsilon=2^{-52}\approx2.2\times10^{-16}\)). 가수 비트 수가 정밀도를, 지수 비트 수가 범위를 정한다. bf16은 범위를, fp16은 정밀도를 택했다.
- 한쪽으로 치우친 작은 오차는 횟수에 비례해 쌓인다. 패트리어트의 0.1초 시계는 틱당 \(9.5\times10^{-8}\)초 오차가 100시간 동안 0.34초가 되었다.
- 비슷한 두 수의 뺄셈은 앞자리가 같은 만큼 유효숫자를 잃는다(상쇄). 식을 대수적으로 바꿔 뺄셈을 없앤다: \(2\sin^2(x/2)\), 근과 계수의 관계, expm1·log1p.
- 수치 미분은 절단 오차(∝ h 또는 h²)와 반올림 오차(∝ 1/h)의 합이라 U자다. 최적 간격은 전진 차분 \(\sim\sqrt\varepsilon\), 중심 차분 \(\sim\sqrt[3]\varepsilon\).
- 명시적 유한 차분은 CFL 조건 \(c\Delta t/\Delta x\le1\)(3차원 FDTD는 \(1/\sqrt3\))을 어기면 반올림 수준의 고주파가 매 스텝 증폭되어 폭발한다.
- FDTD는 E와 H를 반 칸·반 스텝 엇갈린 Yee 격자에서 번갈아 갱신하고, RCWA는 주기 구조를 층별 푸리에 고조파의 고유값 문제로 푼다. 회절 차수 방향은 \(\sin\theta_m=\sin\theta_i+m\lambda/\Lambda\).
- 조건수 \(\kappa=\sigma_{\max}/\sigma_{\min}\)는 문제 자체의 오차 증폭률이다. \(\kappa\approx10^k\)이면 약 k자리를 잃는다.
확인 퀴즈
1. 다음 중 IEEE 754 배정밀도로 정확히 저장되는 수는?
2. float32로 1부터 1씩 계속 더하는 카운터가 있다. 결국 값이 더 이상 늘지 않는 지점은?
3. 작은 x에서 \(\sqrt{1+x}-1\)을 정확하게 계산하려면?
4. 배정밀도에서 중심 차분 \(\frac{f(x+h)-f(x-h)}{2h}\)로 미분할 때 h를 \(10^{-12}\)로 잡았다. 결과는?
5. 1D 파동 시뮬레이션이 Δx = 1 mm, c = 340 m/s(공기 중 음속)에서 안정했다. 격자를 Δx = 0.5 mm로 촘촘히 하면 명시적 리프프로그 스킴의 Δt는?
6. 주기 Λ = 400 nm인 격자에 λ = 550 nm 빛이 공기 중에서 수직으로 입사한다. 공기 쪽으로 반사되는 전파 차수는?