(실수) = (정수부) + (소수부)      (단, 0 <= 소수부 < 1)

           x  = floor(x) + err           (단, 0<= err < 1)

           예:   3.14159  =  3 + 0.14150

                  -2.71828 = -3 + 0.26172

즉, floor(x) 는 x 보다 크지 않은 죄대의 정수를 의미한다. 수학에서 (기호 [x] 로 표기되는) 가우스 기호라고 부르는 함수에 해당한다.

 

C, C++, Java, Python, Ruby, C# 등의 대부분 언어에서는 floor 함수가 부동소수점수의 소소부를 잘라낸 정수부를 구하는데 쓰인다.

Common Lisp 언어에서는 floor 함수가 그런 용도로도 쓰이지만, Python 언어의 divmod 함수 처럼 몫과 나머지를 함께 구하는데 쓰이기도 한다.

 

우선 C 언어와 C++ 언어로 floor 함수를 사용하는 소스이다.

 

[ C 소스 파일명: testFloor.c ]

#include <stdio.h>
#include <math.h>

int main()
{
    printf("floor(-20.0/7) = %f\n", floor(-20.0/7));
    return 0;
}

/*
Output:
floor(-20.0/7) = -3.000000
*/

 

[ C++ 소스 파일명: testFloor.cpp ]

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main()
{
    cout << "floor(-20.0/7) = ";
    cout << setprecision(6) << fixed;
    cout << floor(-20.0/7) << endl;
    return 0;
}

/*
Output:
floor(-20.0/7) = -3.000000
*/

 

 

그어면 Python 의 경우 divmod 함수의 사용 예를 알아 보자.

명령 프롬프트> python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> divmod(23, 7)
(3, 2)
>>> (q, r) = divmod(23, 7)
>>> q
3
>>> r
2
>>> divmod(-20, 7)
(-3, 1)
>>>>>> quit()

 

 

이제 CLisp 의 경우에 대해서 알아 보자.

Common Lisp 언어의 floor 함수는 몫과 나머지를 함께 리턴하지만 리턴된 값들을 받으려면 다소 까다롭다. setq 나 setf 로는 안 되고 multiple-value-setq 를 사용해야 한다.

명령 프롬프트> clisp
  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010

Type :h and hit Enter for context help.

[1]> (floor 23 7)
3 ;
2
[2]> (multiple-value-setq (q r) (floor 23 7))
3
[3]> q
3
[4]> r
2
[5]> (floor -20 7)
-3 ;
1
[6]> (quit)
Bye.


 

 

multiple-value-setq 를 사용하는 더 간단한 예를 알아보자.

[1]> (multiple-value-setq (x y) (values 1 2))
1
[2]> (list x y)
(1 2)
[3]> (multiple-value-setq (x y) (values y x))     ; swapped here
2
[4]> (list x y)
(2 1)

 

단 한 번의 함수 호출로 변수 x, y 의 값이 교환(swap)되였다.

만일 이를 Python 으로 한다면

>>> x, y = 1, 2
>>> x, y
(1, 2)
>>> x, y = y, x     # swapped here
>>> x, y
(2, 1)

 

Posted by Scripter
,