이 문서는 [[CONCRETE-MATH]] 3장.정수 함수 - 1.바닥과 천장을 공부한 노트입니다.

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

  • 두 함수의 정의는 다음과 같다.

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

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

바닥 함수

흔히 사용하는 floor이다.

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이다.

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는 정수이다.
    • 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;
}

천장 - 바닥

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

기본적인 부등식

  • 위의 규칙은 기억해 둘 만한 부등식이다.
    • 그러나 외울 필요는 없다.
    • 조금만 생각해보면 바로 떠올릴 수 있는 것들이다.

천장과 바닥의 관계는 대칭

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

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

  • x 가 정수인 경우 다음의 네 규칙이 성립한다.
  • floor, ceil에 익숙한 프로그래머라면 누구나 알고 있는 내용이다.
    • 설령 모르거나 헷갈리더라도 익숙한 언어로 금방 작동을 확인할 수 있다.

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

  • n이 정수라면, 다음이 가능하다.

다음은 인 경우이다.

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

바닥/천장 부등식

  • n이 정수이고, x가 실수라면 다음이 성립한다.

분수부와 정수부

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

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

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

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

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

Links

  • [[CONCRETE-MATH]]