이 문서는 (책) CONCRETE MATHEMATICS(구체수학) 3장.정수 함수 - 1.바닥과 천장을 공부한 노트입니다.

바닥(floor) 함수와 천장(celing) 함수

  • 두 함수의 정의는 다음과 같다.
x=the greatest integer less than or equal to x x 보다 작거나 같은 최대 정수x=the least integer greater than or equal to xx 보다 크거나 같은 최소 정수

Kenneth E. Iverson introduced this notation, as well as the names "floor" and "ceiling", early in the 1960s.
'천장', '바닥'으로 알려진 이 표기법은 케네스 E. 아이버슨이 1960년대 초에 도입했다.

(수학은 물론이고) 수많은 프로그래밍 언어에서 내림/올림의 용법으로 floor/ceil을 사용하는데 그 어원이 케네스 아이버슨이었구나!

바닥 함수

흔히 사용하는 floor이다.

3.2=33.2=43.0=3e=2e=3π=3π=4

python으로는 다음과 같다.

import math

print(math.floor(3.2))      # 3
print(math.floor(-3.2))     # -4
print(math.floor(3.0))      # 3
print(math.floor(math.e))   # 2
print(math.floor(-math.e))  # -3
print(math.floor(math.pi))  # 3
print(math.floor(-math.pi)) # -4

천장 함수

흔히 사용하는 ceil이다.

3.2=43.2=33.0=3e=3e=2π=4π=3

python으로는 다음과 같다.

import math

print(math.ceil(3.2))       # 4
print(math.ceil(-3.2))      # -3
print(math.ceil(3.0))       # 3
print(math.ceil(math.e))    # 3
print(math.ceil(-math.e))   # -2
print(math.ceil(math.pi))   # 4
print(math.ceil(-math.pi))  # -3

규칙들

x 가 정수인 경우

x=xx is an integerx=x
  • 위의 규칙은 다음을 의미한다.
    • x=x 이면 x는 정수이다.
    • x가 정수이면 x=x 이다.
    • x=x 이면 x는 정수이다.
    • x가 정수이면 x=x 이다.

요약하자면 다음과 같다.

  • x를 내림/올림한 결과가 x와 같다면 정수이다.
  • x가 정수이면, 내림/올림한 결과도 x이다.

이는 흔히 알려져 있는 수학적 사실로, 여러 프로그래밍 언어에서도 이 방식으로 실수 타입이 정수값을 갖고 있는지의 여부를 판별하곤 한다.

다음은 cpython의 float_is_integer 함수이다. 가운데 부분을 잘 보면 x를 내림한 결과가 x와 같은지를 비교하여 True/False를 리턴하고 있다. python은 잘 모르지만 이렇게 하고 있을 거라고 생각해서 찾아 보았더니 나왔다.

static PyObject *
float_is_integer(PyObject *v)
{
    double x = PyFloat_AsDouble(v);
    PyObject *o;

    if (x == -1.0 && PyErr_Occurred())
        return NULL;
    if (!Py_IS_FINITE(x))
        Py_RETURN_FALSE;
    errno = 0;
    PyFPE_START_PROTECT("is_integer", return NULL)

    // floor(x)와 x를 비교해 정수인지 확인
    o = (floor(x) == x) ? Py_True : Py_False;

    PyFPE_END_PROTECT(x)
    if (errno != 0) {
        PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
                             PyExc_ValueError);
        return NULL;
    }
    Py_INCREF(o);
    return o;
}

천장 - 바닥

xx=[x is not an integer]
  • 위의 규칙은 아이버슨의 관례를 사용했다.
    • 아이버슨의 관례는 [ ]안에 있는 명제가 True인 경우 1, 아니면 0을 리턴한다.
  • 즉 위의 규칙은 다음을 의미한다.
    • x가 정수이면 xx=0 이다.
    • x가 정수가 아니면 xx=1 이다.
import math
math.ceil(math.pi) - math.floor(math.pi)    # 1
math.ceil(3) - math.floor(3)                # 0

기본적인 부등식

x1<xx+1>x위의 두 식을 조합하면x1<xxx<x+1
  • 위의 규칙은 기억해 둘 만한 부등식이다.
    • 그러나 외울 필요는 없다.
    • 조금만 생각해보면 바로 떠올릴 수 있는 것들이다.

천장과 바닥의 관계는 대칭

x=xx=x
  • 위의 규칙은 천장/바닥 함수의 관계를 잘 보여 준다.
import math
math.floor(-math.pi) == - math.ceil(math.pi) # True
math.ceil(-math.pi) == - math.floor(math.pi) # True

x가 정수인 경우 유용한 네 가지 규칙

  • x 가 정수인 경우 다음의 네 규칙이 성립한다.
  • floor, ceil에 익숙한 프로그래머라면 누구나 알고 있는 내용이다.
    • 설령 모르거나 헷갈리더라도 익숙한 언어로 금방 작동을 확인할 수 있다.
x=nnx<n+1(a)x=nx1<nx(b)x=nn1<xn(c)x=nxn<x+1(d)

정수 항을 집어넣거나 뺄 수 있다

  • n이 정수라면, 다음이 가능하다.
x+n=x+n,integer n.

다음은 x=π, n=2인 경우이다.

import math
math.floor(math.pi + 2) == math.floor(math.pi) + 2  # True

바닥/천장 부등식

  • n이 정수이고, x가 실수라면 다음이 성립한다.
x<nx<n(a)n<xn<x(b)xnxn(c)nxnx(d)

분수부와 정수부

실수 x를 분수부(fractional part)와 정수부(integer part)로 나눌 수 있다.

만약 1.78이란 숫자가 있다면 정수부와 분수부는 다음과 같다.

  • 정수부: 1
  • 분수부: 0.78

분수부는 { }로 표기하기로 하며, 다음과 같이 정의한다.

{x}=xx

이 식의 좌우 변을 뒤집고 항 하나를 옮겨주면 다음과 같이 된다.

x=x+{x}