{#numeric-numeric-functions} # 수치 함수 산술·로그·삼각 함수들입니다. 대부분 속성을 곧바로 받는 `jsonb` 오버로드와 PostgreSQL에서 온 `double precision` 오버로드를 갖고 있습니다. 어느 쪽이든 Cypher의 `RETURN`은 결과를 `jsonb` 숫자로 출력합니다. 이름이 `d`로 끝나지 않으면 각도는 라디안입니다. 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다. {#numeric-abs} ## abs ``` abs ( x jsonb ) -> jsonb abs ( x numeric ) -> numeric ``` 숫자의 절댓값을 반환합니다. ```cypher MATCH (m:movie {title:'Inception'}) RETURN abs(m.year - 2000) AS gap; ``` ``` gap ----- 10 ``` {#numeric-acos} ## acos ``` acos ( x jsonb ) -> jsonb acos ( x double precision ) -> double precision ``` `x`의 아크코사인을 라디안으로 반환합니다. `x`는 −1과 1 사이여야 합니다. {#numeric-asin} ## asin ``` asin ( x jsonb ) -> jsonb asin ( x double precision ) -> double precision ``` `x`의 아크사인을 라디안으로 반환합니다. `x`는 −1과 1 사이여야 합니다. {#numeric-atan} ## atan ``` atan ( x jsonb ) -> jsonb atan ( x double precision ) -> double precision ``` `x`의 아크탄젠트를 라디안으로 반환합니다. {#numeric-atan2} ## atan2 ``` atan2 ( y jsonb, x jsonb ) -> jsonb atan2 ( y double precision, x double precision ) -> double precision ``` `y / x`의 아크탄젠트를 라디안으로 반환하며, 두 인자의 부호를 써서 결과를 올바른 사분면에 놓습니다. **고려할 점** - `atan(y / x)`보다 이것을 쓰십시오. 그것은 −15/3과 15/−3을 구별할 수 없어 사분면을 잃습니다. ```cypher RETURN cot(1.5) AS cot, asin(1) AS asin, acos(0.5) AS acos, atan(-1) AS atan, atan2(-1.5, 1.3) AS atan2; ``` ``` cot | asin | acos | atan | atan2 ---------------------+--------------------+--------------------+---------------------+--------------------- 0.07091484430265245 | 1.5707963267948966 | 1.0471975511965979 | -0.7853981633974483 | -0.8567056281827387 ``` {#numeric-ceil} ## ceil ``` ceil ( x jsonb ) -> jsonb ceil ( x numeric ) -> numeric ``` `x`보다 작지 않은 가장 작은 정수를 반환합니다. ```cypher RETURN ceil(3.1) AS up, floor(3.1) AS down, round(3.6) AS nearest, sign(-19.93) AS sign; ``` ``` up | down | nearest | sign ----+------+---------+------ 4 | 3 | 4 | -1 ``` {#numeric-cos} ## cos ``` cos ( x jsonb ) -> jsonb cos ( x double precision ) -> double precision ``` 라디안으로 주어진 각의 코사인을 반환합니다. {#numeric-cosd} ## cosd ``` cosd ( x double precision ) -> double precision ``` 도로 주어진 각의 코사인을 반환합니다. **고려할 점** - 4분의 1 회전 지점에서 정확합니다. 각을 먼저 변환하는 쪽은 그렇지 않습니다. `cosd(90)`은 0이지만 `cos(radians(90))`은 0.00000000000000006123233995736766입니다. - 도 단위 형태에는 `jsonb` 오버로드가 없으므로 속성이 `double precision`으로 변환됩니다. ```cypher RETURN sind(30) AS sind, cosd(60) AS cosd, tand(45) AS tand; ``` ``` sind | cosd | tand ------+------+------ 0.5 | 0.5 | 1 ``` {#numeric-cot} ## cot ``` cot ( x jsonb ) -> jsonb cot ( x double precision ) -> double precision ``` 라디안으로 주어진 각의 코탄젠트, 즉 탄젠트의 역수를 반환합니다. 실제 예제는 [`atan2`](#numeric-atan2)를 참고하십시오. {#numeric-degrees} ## degrees ``` degrees ( x jsonb ) -> jsonb degrees ( x double precision ) -> double precision ``` 라디안을 도로 변환합니다. ```cypher RETURN degrees(pi()) AS half_turn, radians(180) AS in_radians; ``` ``` half_turn | in_radians -----------+------------------- 180 | 3.141592653589793 ``` {#numeric-e} ## e ``` e ( ) -> numeric ``` 오일러 수를 `numeric`으로 반환합니다. **고려할 점** - 결과가 `numeric`이므로, `double precision`인 `exp(1)`보다 자릿수가 많습니다. `2.7182818284590452` 대 `2.718281828459045`입니다. ```cypher RETURN e() AS e, exp(1) AS exp_one; ``` ``` e | exp_one --------------------+------------------- 2.7182818284590452 | 2.718281828459045 ``` {#numeric-exp} ## exp ``` exp ( x jsonb ) -> jsonb exp ( x numeric ) -> numeric ``` *e*의 `x`제곱을 반환합니다. {#numeric-floor} ## floor ``` floor ( x jsonb ) -> jsonb floor ( x numeric ) -> numeric ``` `x`보다 크지 않은 가장 큰 정수를 반환합니다. 실제 예제는 [`ceil`](#numeric-ceil)을 참고하십시오. {#numeric-ln} ## ln ``` ln ( x double precision ) -> double precision ln ( x numeric ) -> numeric ``` `x`의 자연로그를 반환합니다. Cypher에서 [`log`](#numeric-log)가 해석되는 함수가 이것이고, 이 이름으로 직접 호출할 수도 있습니다. {#numeric-log} ## log ``` log ( x jsonb ) -> jsonb ``` `x`의 **자연**로그를 반환합니다. **고려할 점** - Cypher 쿼리에서는 파서가 `log`를 [`ln`](#numeric-ln)으로 다시 쓰므로, 결과 컬럼의 이름이 `ln`이 되고 **인자 두 개 형태는 없습니다**: ```cypher RETURN log(2, 8); ``` ``` ERROR: function ln(integer, integer) does not exist LINE 1: RETURN log(2, 8); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ``` - 밑이 10인 PostgreSQL의 `log`와는 반대입니다. Cypher에서 밑 10을 쓰려면 [`log10`](#numeric-log10)을 쓰십시오. ```cypher RETURN log(27) AS natural, log10(27) AS base_ten; ``` ``` natural | base_ten -------------------+-------------------- 3.295836866004329 | 1.4313637641589874 ``` {#numeric-log10} ## log10 ``` log10 ( x double precision ) -> double precision log10 ( x numeric ) -> numeric ``` `x`의 밑 10 로그를 반환합니다. 다시 쓰이지 않으므로 이 이름은 적힌 그대로의 뜻입니다. {#numeric-pi} ## pi ``` pi ( ) -> double precision ``` π를 반환합니다. 실제 예제는 [`degrees`](#numeric-degrees)를 참고하십시오. {#numeric-radians} ## radians ``` radians ( x jsonb ) -> jsonb radians ( x double precision ) -> double precision ``` 도를 라디안으로 변환합니다. {#numeric-rand} ## rand ``` rand ( ) -> jsonb ``` 0 이상 1 미만의 반열린 구간에 있는 수를 반환합니다. **고려할 점** - `rand()`는 불변으로 표시돼 있어서 플래너가 그것을 하나의 상수로 접습니다. 쿼리의 모든 행과 준비된 문장의 모든 실행이 **같은** 수를 봅니다. 대신 PostgreSQL의 `random()`을 호출하십시오. 그것은 변동 함수이고 Cypher에서도 동작합니다. ```cypher FOR x IN [1,2,3] RETURN x, rand(), random(); ``` ``` x | rand | random ---+-------------------+--------------------- 1 | 0.533950385997692 | 0.33269661597409694 2 | 0.533950385997692 | 0.10517878758331145 3 | 0.533950385997692 | 0.3874591104544447 ``` {#numeric-round} ## round ``` round ( x jsonb ) -> jsonb round ( x numeric [, scale integer ] ) -> numeric ``` `x`를 가장 가까운 정수로 반올림하며, 0.5는 0에서 먼 쪽으로 올립니다. **고려할 점** - `jsonb` 형태는 정수로만 반올림합니다. 소수 자리를 남기려면 형 변환을 해서 `numeric` 형태를 쓰십시오. `round(x::numeric, 2)`입니다. {#numeric-sign} ## sign ``` sign ( x jsonb ) -> jsonb sign ( x numeric ) -> numeric ``` `x`의 부호에 따라 −1, 0, 1을 반환합니다. 실제 예제는 [`ceil`](#numeric-ceil)을 참고하십시오. {#numeric-sin} ## sin ``` sin ( x double precision ) -> double precision ``` 라디안으로 주어진 각의 사인을 반환합니다. **고려할 점** - 삼각 함수 중 사인만 자기 이름으로 된 `jsonb` 오버로드가 없습니다. `jsonb` 사인은 `jsonb_sin`으로 카탈로그에 등록돼 있습니다. 잃는 것은 없습니다. 속성이 `double precision`으로 변환되고 `sin()`이 PostgreSQL 함수로 해석됩니다. 다만 `jsonb` 인자에 대한 결과 타입이 이웃 함수들과 다릅니다. ```cypher RETURN sin(0.5) AS sin, cos(0) AS cos, tan(0) AS tan; ``` ``` sin | cos | tan -------------------+-----+----- 0.479425538604203 | 1 | 0 ``` ```cypher MATCH (m:movie {title:'The Matrix'}) RETURN pg_typeof(cos(m.embedding[0])) AS cos_t, pg_typeof(sin(m.embedding[0])) AS sin_t, pg_typeof(tan(m.embedding[0])) AS tan_t; ``` ``` cos_t | sin_t | tan_t ---------+--------------------+--------- "jsonb" | "double precision" | "jsonb" ``` {#numeric-sind} ## sind ``` sind ( x double precision ) -> double precision ``` 도로 주어진 각의 사인을 반환합니다. 실제 예제는 [`cosd`](#numeric-cosd)를 참고하십시오. {#numeric-sqrt} ## sqrt ``` sqrt ( x jsonb ) -> jsonb sqrt ( x numeric ) -> numeric ``` `x`의 제곱근을 반환합니다. **고려할 점** - 음수 인자는 null이 아니라 오류입니다: ```cypher RETURN sqrt(-16); ``` ``` ERROR: cannot take square root of a negative number ``` ```cypher MATCH (m:movie {title:'The Matrix'}) RETURN sqrt(m.year) AS root; ``` ``` root -------------------- 44.710177812216314 ``` {#numeric-tan} ## tan ``` tan ( x jsonb ) -> jsonb tan ( x double precision ) -> double precision ``` 라디안으로 주어진 각의 탄젠트를 반환합니다. 실제 예제는 [`sin`](#numeric-sin)을 참고하십시오. {#numeric-tand} ## tand ``` tand ( x double precision ) -> double precision ``` 도로 주어진 각의 탄젠트를 반환합니다. 실제 예제는 [`cosd`](#numeric-cosd)를 참고하십시오. {#numeric-arithmetic-on-properties} ## 속성에 대한 산술 `+`, `-`, `*`, `/`, `%`, `^` 연산자는 속성에 대해 동작하지만, `jsonb` 피연산자에서는 SQL의 규칙이 아니라 `jsonb` 자신의 규칙을 따릅니다. 정수 둘은 정수로 나뉩니다. ```cypher RETURN 7 % 3 AS modulo, 2 ^ 10 AS power, 7 / 2 AS integer_division, 7.0 / 2 AS real_division; ``` ``` modulo | power | integer_division | real_division --------+-------+------------------+-------------------- 1 | 1024 | 3 | 3.5000000000000000 ``` 각각 `jsonb`에 대한, 백틱으로 이름 붙은 연산자로 구현돼 있습니다. [jsonb에 대한 산술 연산자](#jsonb-arithmetic-operators-on-jsonb)를 참고하십시오. {#numeric-compatibility} ## 호환성 {#numeric-opencypher} ### openCypher 여기서 `log()`는 밑이 *e*이고 PostgreSQL에서는 밑이 10입니다. openCypher도 자연로그를 `log`로 표기하므로, Cypher 쿼리는 이식 가능하고 SQL 쿼리는 그렇지 않습니다. openCypher의 `e()`와 `rand()`도 있습니다. `rand()`는 상수로 접힌다는 점에서 벗어나 있습니다. `haversin()`은 지원되지 않습니다. {#numeric-see-also} ## 관련 항목 - [모든 함수](all-functions.md) — 모든 함수를 한 표에 - [집계 함수](aggregate.md) — `avg`, `sum`, `stdev` - [타입 변환 함수](type-conversion.md) — `toInteger`, `toFloat`