Integers & reals
블록을 만들다 보면 "이 값을 정수로 다룰지 실수로 다룰지 정해 주세요"라는 요구를 자주 만나게 됩니다. Simulizer가 까다로워서가 아니라, 컴퓨터가 이 두 종류의 수를 서로 다르게 다루기 때문입니다.
How they differ
- 정수 는 세는 수입니다.
1,2,3, …,-5. 사람·횟수·인덱스에 적합합니다. - 실수 는 재는 수입니다.
3.14,-0.001,1.6 × 10⁻¹⁹. 길이·온도·시간·확률에 적합합니다.
대부분의 시뮬에서는 결과로 재는 값은 실수, 그것을 세는 변수는 정수가 됩니다. 반복문의 횟수 변수는 정수이고, 그 안에서 계산되는 값은 실수인 식입니다.
Mixing them
정수와 실수를 섞어 쓰면 Simulizer는 자동으로 실수로 통일합니다. 정수
3 과 실수 0.5 를 더하면 결과는 실수 3.5 가 됩니다. 다만 반대
방향(실수 → 정수)으로는 자동 변환이 일어나지 않습니다. 실수를 정수로
바꾸려면 명시적으로 변환 블록을 써야 합니다.
이 규칙은 항상 같은 방향이므로, 한 번 익혀 두면 헷갈릴 일이 없습니다.
Why not always promote to real
두 가지 이유가 있습니다.
- 인덱스는 정수여야 합니다. 배열
arr[2.7]같은 표현은 의미가 없습니다. 정수와 실수를 구분해 두면 잘못된 인덱싱이 일찍 잡힙니다. - 속도와 메모리. 정수 연산은 실수 연산보다 빠르고, 8바이트 대신 4바이트만 씁니다. 큰 반복문에서는 이 차이가 쌓여 눈에 띄게 됩니다.
Pitfalls
- 작은 차이가 누적되면 의외로 큰 오차로 불어납니다. 100만 번 더한 결과가 마지막 자리에서 어긋날 수 있습니다.
- 큰 수와 매우 작은 수를 함께 다루면 작은 수가 완전히 사라지는
현상이 생깁니다. 예를 들어
1e16 + 1 == 1e16입니다. 64-bit 실수의 한계입니다. - 실수
0.1 + 0.2는 정확히0.3이 아니라0.30000000000000004입니다. 이는 Simulizer만의 문제가 아니라 모든 컴퓨터에 공통된 문제입니다.
Inspecting in code
캔버스의 WAT 탭을 열어 보세요. 변환된 코드에서 정수는 i32,
실수는 f64 로 표시됩니다. 비전공자라면 이 단락은 건너뛰어도 괜찮습니다.