(실수) = (정수부) + (소수부) (단, 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 <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 <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)
'프로그래밍 > Common Lisp' 카테고리의 다른 글
(Common Lisp 언어로 구현해 보는) 십진법의 신비: 숫자 계산 피라미드 세 가지 (0) | 2013.09.23 |
---|---|
스트링 벡터에서 스트링 찾기(find) with Common Lisp (0) | 2013.09.12 |
Common Lisp 언어로 역삼각함수, 역쌍곡선함수 값을 구하는 예제 (0) | 2013.09.11 |
감마함수(gamma function)의 값을 (유효수자 15자리 까지 정밀하게) 계산하는 Common Lisp 언어 소스 (0) | 2013.09.08 |
Common Lisp 언어로 복소수 계산하기 (0) | 2013.09.07 |