=====================  数学函数和操作符 ===================== .. container:: sect1 :name: FUNCTIONS-MATH .. container:: titlepage .. container:: .. container:: .. rubric:: 数学函数和操作符 :name: 数学函数和操作符 :class: title PostgreSQL为很多类型提供了数学操作符。对于那些没有标准数学表达的类型(如日期/时间类型),我们将在后续小节中描述实际的行为。 `表 `__\ 展示了所有可用的数学操作符。 .. container:: table :name: FUNCTIONS-MATH-OP-TABLE **表 数学操作符** .. container:: table-contents ======= ====================== ============= ======= 操作符 描述 例子 结果 ======= ====================== ============= ======= ``+`` 加 ``2 + 3`` ``5`` ``-`` 减 ``2 - 3`` ``-1`` ``*`` 乘 ``2 * 3`` ``6`` ``/`` 除(整数除法截断结果) ``4 / 2`` ``2`` ``%`` 模(取余) ``5 % 4`` ``1`` ``^`` 指数(从左至右结合) ``2.0 ^ 3.0`` ``8`` ``|/`` 平方根 ``|/ 25.0`` ``5`` ``||/`` 立方根 ``||/ 27.0`` ``3`` ``!`` 阶乘 ``5 !`` ``120`` ``!!`` 阶乘(前缀操作符) ``!! 5`` ``120`` ``@`` 绝对值 ``@ -5.0`` ``5`` ``&`` 按位与 ``91 & 15`` ``11`` ``|`` 按位或 ``32 | 3`` ``35`` ``#`` 按位异或 ``17 # 5`` ``20`` ``~`` 按位求反 ``~1`` ``-2`` ``<<`` 按位左移 ``1 << 4`` ``16`` ``>>`` 按位右移 ``8 >> 2`` ``2`` ======= ====================== ============= ======= 按位操作操作符只能用于整数数据类型,而其它的操作符可以用于全部数字数据类型。按位操作的操作符还可以用于位串类型\ ``bit``\ 和\ ``bit varying``\ , 如\ `表 `__\ 所示。 `表 `__\ 显示了可用的数学函数。在该表中,\ ``dp``\ 表示\ ``double precision``\ 。这些函数中有许多都有多种不同的形式,区别是参数不同。除非特别指明,任何特定形式的函数都返回和它的参数相同的数据类型。 处理\ ``double precision``\ 数据的函数大多数是在宿主系统的 C 库基础上实现的;因此,边界情况下的准确度和行为是根据宿主系统而变化的。 .. container:: table :name: FUNCTIONS-MATH-FUNC-TABLE **表 数学函数** .. container:: table-contents +-------------+-------------+-------------+-------------+-------------+ | 函数 | 返回类型 | 描述 | 例子 | 结果 | +=============+=============+=============+=============+=============+ | abs(x ) | (和 | 绝对值 | a\ | 17.4 | | | 输入相同) | | bs(-17.4) | | +-------------+-------------+-------------+-------------+-------------+ | | dp | 立方根 | c\ | 3 | | | | | brt(27.0) | | | cbrt(dp ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | (和 | 不 | ce\ | -42 | | ceil (dp | 输入相同) | 小于参数的 | il(-42.8) | | | or | | 最近的整数 | | | | | | | | | | numeric) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | (和 | 不 | ceili\ | -95 | | c\ | 输入相同) | 小于参数的 | ng(-95.3) | | | eiling(dp | | 最近的整数 | | | | or | | (\ ceil | | | | | | \ 的别名) | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | dp | 把弧 | deg\ | 28.6478 | | de | | 度转为角度 | rees(0.5) | 897565412 | | grees(dp ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | div(y | numeric | | div | 2 | | | | y / x | (9,4) | | | numeric ,| | \ 的整数商 | | | | x | | | | | | | | | | | | numeric )| | | | | +-------------+-------------+-------------+-------------+-------------+ | exp(dp | (和 | 指数 | exp | 2.71828\ | | or | 输入相同) | | (1.0) | 182845905 | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | (和 | 不 | flo\ | -43 | | | 输入相同) | 大于参数的 | or(-42.8) | | | floor(dp | | 最近的整数 | | | | or | | | | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | ln(dp | (和 | 自然对数 | ln(2.0) | 0.693147\ | | or | 输入相同) | | | 180559945 | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | log(dp | (和 | 以1 | l\ | 2 | | or | 输入相同) | 0为底的对数 | og(100.0) | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | (和 | 以1 | log | 2 | | | 输入相同) | 0为底的对数 | 10(100.0) | | | log10(dp | | | | | | or | | | | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | log(b | numeric | 以 | log(2 | 6.0 | | | | \ b \ | .0, 64.0) | 000000000 | | numeric , | | 为底的对数 | | | | x | | | | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | mod(y , | (和参数 | | mod | 1 | | x ) | 类型相同) | y / x | (9,4) | | | | | \ 的余数 | | | +-------------+-------------+-------------+-------------+-------------+ | pi() | dp | “π”常数 | pi() | 3.14159 | | | | | | 265358979 | +-------------+-------------+-------------+-------------+-------------+ | | dp | 求\ a | power( | 729 | | power(a | | \ \ 的\ | 9.0, 3.0) | | | dp , | | b \ 次幂 | | | | b | | | | | | dp ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | power(a | numeric | 求\ a | power( | 729 | | | | \ 的\ | 9.0, 3.0) | | | numeric , | | b \ 次幂 | | | | b | | | | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | dp | 把角 | \ radi | \ 0.785398 | | ra\ | | 度转为弧度 | ans(45.0) | 163397448 | | dians(dp ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | (和 | 圆整为最 | \ ro | 42 | | | 输入相同) | 接近的整数 | und(42.4) | | | round(dp | | | | | | or | | | | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | round(v | numeric | 圆整为 | \ round(42 | 42.44 | | | | \ s \ | .4382, 2) | | | numeric , | | 位小数数字 | | | | s | | | | | | int ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | integer | 参数的精 | \ sc | 2 | | \ scale | | 度(小数点 | ale(8.41) | | | (numeric ) | | 后的位数) | | | +-------------+-------------+-------------+-------------+-------------+ | | (和 | 参数 | \ s | -1 | | sign(dp | 输入相同) | 的符号(-1, | ign(-8.4) | | | or | | 0, +1) | | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | (和 | 平方根 | \ sqrt | \ 1.4142 | | sqrt(dp | 输入相同) | | (2.0) | 135623731 | | or | | | | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | | (和 | 截断( | \ tr | 42 | | | 输入相同) | 向零靠近) | unc(42.8) | | | trunc(dp | | | | | | or | | | | | | | | | | | | numeric ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | trunc(v | numeric | 截 | \ trunc(42 | 42.43 | | | | 断为\ s | .4382, 2) | | | numeric , | | \ \ 位小数 | | | | s | | 位置的数字 | | | | int ) | | | | | +-------------+-------------+-------------+-------------+-------------+ | width_ | int | 返回一 | \ widt | 3 | | bucket(op | | 个桶号,这 | h_bucket(5. | | | dp , | | 个桶是在一 | 35, 0.024, | | | b1 | | 个柱状图中 | 10.06, 5) | | | dp , | | \ opera | | | | b2 | | nd \ 将被 | | | | dp , | | 分配的那个 | | | | count | | 桶,该柱状 | | | | int ) | | 图有\ c | | | | | | ount \ 个 | | | | | | 散布在范围 | | | | | | \ b1 | | | | | | \ 到\ b2 | | | | | | \ \ 上的等 | | | | | | 宽桶。对于 | | | | | | 超过该范围 | | | | | | 的输入,将 | | | | | | 返回\ 0 | | | | | | \ 或者\ | | | | | | count \ +1 | | | +-------------+-------------+-------------+-------------+-------------+ | | int | 返回一 | \ widt | 3 | | width_ | | 个桶号,这 | h_bucket(5. | | | bucket(op | | 个桶是在一 | 35, 0.024, | | | | | 个柱状图中 | 10.06, 5) | | | numeric , | | \ opera | | | | \ b1 | | nd \ 将被 | | | | | | 分配的那个 | | | | numeric , | | 桶,该柱状 | | | | \ b2 | | 图有\ c | | | | | | ount \ 个 | | | | numeric , | | 散布在范围 | | | | \ count | | \ b1 | | | | int ) | | \ 到\ b2 | | | | | | \ \ 上的等 | | | | | | 宽桶。对于 | | | | | | 超过该范围 | | | | | | 的输入,将 | | | | | | 返回\ 0 | | | | | | \ 或者\ | | | | | | count \ +1 | | | +-------------+-------------+-------------+-------------+-------------+ | | int | 返回一个 | w\ | 2 | | width_bucke\| | 桶号,这个 | idth_bucke | | | t(operand | | 桶是在给定 | t(now(), ar | | | an | | 数组中\ | ray['yester | | | yelement , | | operand | day', 'toda | | | \ th | | 将被分配 | y', 'tomorr | | | resholds | | 的桶,该数 | ow']::times | | | | | 组列出了桶 | tamptz[]) | | | anyarray ) | | 的下界。对 | | | | | | 于一个低于 | | | | | | 第一个下界 | | | | | | 的输入返回 | | | | | | 0 \ 。 | | | | | | \ thresh | | | | | | olds \ 数 | | | | | | 组\ 必须被 | | | | | | 排好序 \ , | | | | | | 最小 | | | | | | 的排在最前 | | | | | | 面,否则将 | | | | | | 会得到意想 | | | | | | 不到的结果 | | | +-------------+-------------+-------------+-------------+-------------+ `表 `__\ 展示了用于产生随机数的函数。 .. container:: table :name: FUNCTIONS-MATH-RANDOM-TABLE **表 随机函数** .. container:: table-contents +-----------------+----------+---------------------------------------+ | 函数 | 返回类型 | 描述 | +=================+==========+=======================================+ | ``random()`` | ``dp`` | 范围 0.0 <= x < 1.0 中的随机值 | +-----------------+----------+---------------------------------------+ | | ``void`` | 为后续的 | | ``setseed(dp``) | | \ ``random()``\ 调用设置种子(值为于 | | | | -1.0 和 1.0 之间,包括边界值) | +-----------------+----------+---------------------------------------+ ``random()``\ 函数使用了一个简单的线性共轭算法。 它的速度很快,但不适合于密码学应用;关于更安全的替代方案,请参阅 `pgcrypto `__\ 模块。 如果\ ``setseed()``\ 被调用,那么当前会话中的后续\ ``random()``\ 调用的结果可以通过使用相同的参数重新发布\ ``setseed()``\ 来重复。 `表 `__\ 显示了可用的三角函数。所有这些函数都有类型为\ ``double precision``\ 的参数和返回类型。每一种三角函数都有两个变体,一个以弧度度量角,另一个以角度度量角。 .. container:: table :name: FUNCTIONS-MATH-TRIG-TABLE **表 三角函数** .. container:: table-contents ===================== ====================== ======================= 函数(弧度) 函数(角度) 描述 ===================== ====================== ======================= ``acos(x)`` ``acosd(x)`` 反余弦 ``asin(x)`` ``asind(x)`` 反正弦 ``atan(x)`` ``atand(x)`` 反正切 ``atan2(y, x)`` ``atan2d(y, x)`` ``y``/ ``x`` \ 的反正切 ``cos(x)`` ``cosd(x)`` 余弦 ``cot(x)`` ``cotd(x)`` 余切 ``sin(x)`` ``sind(x)`` 正弦 ``tan(x)`` ``tand(x)`` 正切 ===================== ====================== ======================= .. note:: .. rubric:: 注意 :name: 注意 :class: title 另一种使用以角度度量的角的方法是使用早前展示的单位转换函数\ ``radians()``\ 和\ ``degrees()``\ 。不过,使用基于角度的三角函数更好,因为这类方法能避免\ ``sind(30)``\ 等特殊情况下的舍入偏差。 `表 `__\ 显示的是 可用的双曲函数。 所有这些函数接收参数,并返回类型为\ ``double precision``\ 的值。 .. container:: table :name: FUNCTIONS-MATH-HYP-TABLE **表 双曲函数** .. container:: table-contents ============ ========== ============ ===== 函数 描述 举例 结果 ============ ========== ============ ===== ``sinh(x)`` 双曲正弦 ``sinh(0)`` ``0`` ``cosh(x)`` 双曲余弦 ``cosh(0)`` ``1`` ``tanh(x)`` 双曲切线 ``tanh(0)`` ``0`` 反双曲正弦 ``asinh(0)`` ``0`` ``asinh(x)`` 反双曲余弦 ``acosh(1)`` ``0`` ``acosh(x)`` 反双曲切线 ``atanh(0)`` ``0`` ``atanh(x)`` ============ ========== ============ =====