@divCeil — 올림 나눗셈

@divCeil — 올림 나눗셈

나눗셈 결과에 소수점이 생기면 양의 무한대 방향(ceil)으로 올려서 정수 몫을 돌려주는 내장 함수예요. 반올림이 아니라 '올림'이라는 점이 핵심이에요.

출처: Zig Documentation

본문

@divCeil(numerator: T, denominator: T) T

@divCeil은 두 값을 나눈 뒤 올림(ceil)한 정수 몫을 반환하는 내장 함수예요. 나눗셈 결과가 딱 떨어지지 않으면 소수점을 버리는 게 아니라, 양의 무한대 쪽으로 올림해서 다음 정수로 만들어요. 그런데 이 함수를 쓰려면 두 가지 조건을 호출하는 쪽이 보장해야 해요.

  • denominator != 0 — 나누는 수가 0이면 안 돼요.
  • !(@typeInfo(T) == .int and T.is_signed and numerator == std.math.minInt(T) and denominator == -1) — 부호 있는 정수에서 가장 작은 값(minInt)을 -1로 나누는 최악의 오버플로(overflow) 상황을 만들면 안 돼요. 이 경우는 수학적으로 올바른 결과가 타입의 범위를 벗어나기 때문에 미리 막아두는 거예요.

구체적으로 어떻게 올림되는지 예시를 보면 한 번에 와 닿아요.

@divCeil(5, 3)  // == 2
@divCeil(-5, 3) // == -1

@divCeil(5, 3)5 ÷ 3 = 1.66…이니까 올림해서 2가 돼요. 반대로 @divCeil(-5, 3)-5 ÷ 3 = -1.66…인데, 이 값을 양의 무한대 방향으로 올리면 -1.66…보다 큰 가장 가까운 정수인 -1이 돼요. 즉 음수일 때 '올림'은 절댓값이 작아지는 방향이라는 점을 기억해 두면 자연스러워요.

그런데 여기서 한 가지 더 알아두면 좋아요. 예시처럼 나누는 수가 0이 아닌지는 전적으로 호출자가 보장해야 하므로, 만약 나눗셈 중에 나누는 수가 0이 될 가능성이 조금이라도 있다면 이 내장 함수는 어울리지 않아요. 그럴 때는 오류 코드(error)를 반환해 주는 함수를 쓰는 게 더 안전해요.

@import("std").math.divCeil

이건 std.math에 있는 함수라서, 나눗셈에 문제가 생기면 오류 코드를 돌려주는 방식으로 동작해요. 그래서 '조건을 보장할 수 있을 때는 내장 함수, 위험이 있으면 std 함수' 정도로 기억하면 돼요.

더 알아보기

  • @divFloor — 음의 무한대 방향으로 내리는 나눗셈
  • @divTrunc — 0 방향으로 잘라내는 나눗셈
  • @divExact — 나눗셈이 정확히 떨어질 때만 사용하는 나눗셈