Simulizer

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 로 표시됩니다. 비전공자라면 이 단락은 건너뛰어도 괜찮습니다.

See also