数值

数值原语以通用方式定义,通过按位宽 \(N\) 索引的操作符来定义。

某些操作符是非确定性的,因为它们可以返回多个可能的结果之一(例如不同的 NaN 值)。从技术上讲,每个操作符都返回允许值的集合。为了方便起见,确定性结果被表达为普通值,这些值被假定为与相应的单例集合相对应。

某些操作符是部分的,因为它们在某些输入上没有定义。从技术上讲,对于这些输入,返回一个空的结果集。

在正式符号中,每个操作符都由等式子句定义,这些子句按优先级降序应用。也就是说,第一个适用于给定参数的子句定义结果。在某些情况下,类似的子句通过使用符号 \(\pm\)\(\mp\) 结合成一个。当在单个子句中出现多个这些占位符时,必须一致地解析它们:要么为所有占位符选择上标,要么为所有占位符选择下标。

注意

例如,\(\href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}\) 操作符定义如下

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(\pm p_1, \pm p_2) &=& \pm p_1 \\ \href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(\pm p_1, \mp p_2) &=& \mp p_1 \\ \end{array}\end{split}\]

此定义应被视为以下每个子句扩展为两个单独子句的简写

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(+ p_1, + p_2) &=& + p_1 \\ \href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(- p_1, - p_2) &=& - p_1 \\ \href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(+ p_1, - p_2) &=& - p_1 \\ \href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(- p_1, + p_2) &=& + p_1 \\ \end{array}\end{split}\]

数值操作符通过对输入序列逐元素应用操作符来提升到输入序列,返回结果序列。当有多个输入时,它们必须具有相同的长度。

\[\begin{array}{lll@{\qquad}l} op(c_1^n, \dots, c_k^n) &=& op(c_1^n[0], \dots, c_k^n[0])~\dots~op(c_1^n[n-1], \dots, c_k^n[n-1]) \end{array}\]

注意

例如,一元操作符 \(\href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}\),当给定一个浮点值序列时,返回一个浮点结果序列

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}_N(z^n) &=& \href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}_N(z[0])~\dots~\href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}_N(z[n]) \end{array}\]

二元操作符 \(\href{../exec/numerics.html#op-iadd}{\mathrm{iadd}}\),当给定两个长度相同的整数序列时,\(n\),返回一个整数结果序列

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-iadd}{\mathrm{iadd}}_N(i_1^n, i_2^n) &=& \href{../exec/numerics.html#op-iadd}{\mathrm{iadd}}_N(i_1[0], i_2[0])~\dots~\href{../exec/numerics.html#op-iadd}{\mathrm{iadd}}_N(i_1[n], i_2[n]) \end{array}\]

约定

  • 元变量 \(d\) 用于表示单个位。

  • 元变量 \(p\) 用于表示浮点值的(无符号)幅度,包括 \(\href{../syntax/values.html#syntax-float}{\mathsf{nan}}\)\(\infty\)

  • 元变量 \(q\) 用于表示(无符号)有理幅度,不包括 \(\href{../syntax/values.html#syntax-float}{\mathsf{nan}}\)\(\infty\)

  • 符号 \(f^{-1}\) 表示双射函数 \(f\) 的逆。

  • 有理值的截断写成 \(\href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(\pm q)\),具有通常的数学定义

    \[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(\pm q) &=& \pm i & (\mathrel{\mbox{if}} i \in \mathbb{N} \wedge +q - 1 < i \leq +q) \\ \end{array}\end{split}\]
  • 整数的饱和写成 \(\href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i)\)\(\href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(i)\)。这两个函数的参数范围是任意有符号整数。

    • 无符号饱和,\(\href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i)\)\(i\) 限制在 \(0\)\(2^N-1\) 之间

      \[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i) &=& 2^N-1 & (\mathrel{\mbox{if}} i > 2^N-1)\\ \href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i) &=& 0 & (\mathrel{\mbox{if}} i < 0) \\ \href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i) &=& i & (\mathrel{\mbox{otherwise}}) \\ \end{array}\end{split}\]
    • 有符号饱和,\(\href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(i)\)\(i\) 限制在 \(-2^{N-1}\)\(2^{N-1}-1\) 之间

    \[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(i) &=& \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N^{-1}(-2^{N-1}) & (\mathrel{\mbox{if}} i < -2^{N-1})\\ \href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(i) &=& \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N^{-1}(2^{N-1}-1) & (\mathrel{\mbox{if}} i > 2^{N-1}-1)\\ \href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(i) &=& i & (\mathrel{\mbox{otherwise}}) \end{array}\end{split}\]

表示形式

数字和数值向量具有作为一系列位的底层二进制表示形式

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-bits}{\mathrm{bits}}_{\href{../syntax/types.html#syntax-valtype}{\mathsf{i}N}}(i) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i) \\ \href{../exec/numerics.html#aux-bits}{\mathrm{bits}}_{\href{../syntax/types.html#syntax-valtype}{\mathsf{f}N}}(z) &=& \href{../exec/numerics.html#aux-fbits}{\mathrm{fbits}}_N(z) \\ \href{../exec/numerics.html#aux-bits}{\mathrm{bits}}_{\href{../syntax/types.html#syntax-valtype}{\mathsf{v}N}}(i) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i) \\ \end{array}\end{split}\]

这些函数中的每一个都是双射,因此它们是可逆的。

整数

整数 表示为二进制无符号数

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i) &=& d_{N-1}~\dots~d_0 & (i = 2^{N-1}\cdot d_{N-1} + \dots + 2^0\cdot d_0) \\ \end{array}\end{split}\]

布尔运算符,如 \(\wedge\)\(\vee\)\(\veebar\),通过逐点应用它们来提升到长度相等的位序列。

浮点数

浮点值IEEE 754(第 3.4 节)定义的相应二进制格式表示

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-fbits}{\mathrm{fbits}}_N(\pm (1+m\cdot 2^{-M})\cdot 2^e) &=& \href{../exec/numerics.html#aux-fsign}{\mathrm{fsign}}({\pm})~\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_E(e+\href{../exec/numerics.html#aux-fbias}{\mathrm{fbias}}_N)~\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_M(m) \\ \href{../exec/numerics.html#aux-fbits}{\mathrm{fbits}}_N(\pm (0+m\cdot 2^{-M})\cdot 2^e) &=& \href{../exec/numerics.html#aux-fsign}{\mathrm{fsign}}({\pm})~(0)^E~\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_M(m) \\ \href{../exec/numerics.html#aux-fbits}{\mathrm{fbits}}_N(\pm \infty) &=& \href{../exec/numerics.html#aux-fsign}{\mathrm{fsign}}({\pm})~(1)^E~(0)^M \\ \href{../exec/numerics.html#aux-fbits}{\mathrm{fbits}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-fsign}{\mathrm{fsign}}({\pm})~(1)^E~\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_M(n) \\[1ex] \href{../exec/numerics.html#aux-fbias}{\mathrm{fbias}}_N &=& 2^{E-1}-1 \\ \href{../exec/numerics.html#aux-fsign}{\mathrm{fsign}}({+}) &=& 0 \\ \href{../exec/numerics.html#aux-fsign}{\mathrm{fsign}}({-}) &=& 1 \\ \end{array}\end{split}\]

其中 \(M = \href{../syntax/values.html#aux-significand}{\mathrm{signif}}(N)\)\(E = \href{../syntax/values.html#aux-exponent}{\mathrm{expon}}(N)\)

向量

类型为 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{v}N}\) 的数值向量具有与 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{i}N}\) 相同的底层表示形式。它们也可以解释为一系列数值,这些数值打包成 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{v}N}\),具有特定的 \(\href{../syntax/instructions.html#syntax-shape}{\mathit{shape}}\) \(t\mathsf{x}M\),前提是 \(N = |t|\cdot M\)

\[\begin{split}\begin{array}{l} \begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-lanes}{\mathrm{lanes}}_{t\mathsf{x}M}(c) &=& c_0~\dots~c_{M-1} \\ \end{array} \\ \qquad \begin{array}[t]{@{}r@{~}l@{}l@{~}l@{~}l} (\mathrel{\mbox{where}} & w &=& |t| / 8 \\ \wedge & b^\ast &=& \href{../exec/numerics.html#aux-bytes}{\mathrm{bytes}}_{\href{../syntax/types.html#syntax-valtype}{\mathsf{i}N}}(c) \\ \wedge & c_i &=& \href{../exec/numerics.html#aux-bytes}{\mathrm{bytes}}_{t}^{-1}(b^\ast[i \cdot w \href{../syntax/conventions.html#notation-slice}{\mathrel{\mathbf{:}}} w])) \end{array} \end{array}\end{split}\]

此函数是 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{i}N}\) 上的双射,因此它是可逆的。

存储

当数字存储到 内存 中时,它会以 小端 字节顺序转换为一系列 字节

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-bytes}{\mathrm{bytes}}_t(i) &=& \href{../exec/numerics.html#aux-littleendian}{\mathrm{littleendian}}(\href{../exec/numerics.html#aux-bits}{\mathrm{bits}}_t(i)) \\[1ex] \href{../exec/numerics.html#aux-littleendian}{\mathrm{littleendian}}(\epsilon) &=& \epsilon \\ \href{../exec/numerics.html#aux-littleendian}{\mathrm{littleendian}}(d^8~{d'}^\ast~) &=& \href{../exec/numerics.html#aux-littleendian}{\mathrm{littleendian}}({d'}^\ast)~\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_8^{-1}(d^8) \\ \end{array}\end{split}\]

同样,这些函数是可逆的双射。

整数运算

符号解释

整数运算符在 \(\href{../syntax/values.html#syntax-int}{\mathit{i}N}\) 值上定义。使用有符号解释的操作符使用以下定义转换该值,该定义在该值位于值范围的上半部分时(即其最高有效位为 \(1\))取二进制补码

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i) &=& i & (0 \leq i < 2^{N-1}) \\ \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i) &=& i - 2^N & (2^{N-1} \leq i < 2^N) \\ \end{array}\end{split}\]

此函数是双射,因此是可逆的。

布尔解释

谓词的整数结果——即 测试关系 运算符——使用以下辅助函数定义,该函数根据条件产生值 \(1\)\(0\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(C) &=& 1 & (\mathrel{\mbox{if}} C) \\ \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(C) &=& 0 & (\mathrel{\mbox{otherwise}}) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-iadd}{\mathrm{iadd}}_N(i_1, i_2)\)

  • 返回 \(i_1\)\(i_2\) 相加后模 \(2^N\) 的结果。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-iadd}{\mathrm{iadd}}_N(i_1, i_2) &=& (i_1 + i_2) \mathbin{\mathrm{mod}} 2^N \end{array}\]

\(\href{../exec/numerics.html#op-isub}{\mathrm{isub}}_N(i_1, i_2)\)

  • 返回 \(i_1\) 减去 \(i_2\) 后模 \(2^N\) 的结果。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-isub}{\mathrm{isub}}_N(i_1, i_2) &=& (i_1 - i_2 + 2^N) \mathbin{\mathrm{mod}} 2^N \end{array}\]

\(\href{../exec/numerics.html#op-imul}{\mathrm{imul}}_N(i_1, i_2)\)

  • 返回 \(i_1\)\(i_2\) 相乘后模 \(2^N\) 的结果。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-imul}{\mathrm{imul}}_N(i_1, i_2) &=& (i_1 \cdot i_2) \mathbin{\mathrm{mod}} 2^N \end{array}\]

\(\href{../exec/numerics.html#op-idiv-u}{\mathrm{idiv\_u}}_N(i_1, i_2)\)

  • 如果 \(i_2\)\(0\),则结果未定义。

  • 否则,返回 \(i_1\) 除以 \(i_2\) 后向零截断的结果。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-idiv-u}{\mathrm{idiv\_u}}_N(i_1, 0) &=& \{\} \\ \href{../exec/numerics.html#op-idiv-u}{\mathrm{idiv\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(i_1 / i_2) \\ \end{array}\end{split}\]

注意

此运算符是 部分的.

\(\href{../exec/numerics.html#op-idiv-s}{\mathrm{idiv\_s}}_N(i_1, i_2)\)

  • \(j_1\)\(i_1\)有符号解释

  • \(j_2\)\(i_2\)有符号解释

  • 如果 \(j_2\)\(0\),则结果未定义。

  • 否则,如果 \(j_1\) 除以 \(j_2\) 等于 \(2^{N-1}\),则结果未定义。

  • 否则,返回 \(j_1\) 除以 \(j_2\) 后向零截断的结果。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-idiv-s}{\mathrm{idiv\_s}}_N(i_1, 0) &=& \{\} \\ \href{../exec/numerics.html#op-idiv-s}{\mathrm{idiv\_s}}_N(i_1, i_2) &=& \{\} \qquad\qquad (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) / \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2) = 2^{N-1}) \\ \href{../exec/numerics.html#op-idiv-s}{\mathrm{idiv\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N^{-1}(\href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) / \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2))) \\ \end{array}\end{split}\]

注意

此运算符是 部分的。除了除以 \(0\) 之外,\( (-2^{N-1})/(-1) = +2^{N-1}\) 的结果无法用 \(N\) 位有符号整数表示。

\(\href{../exec/numerics.html#op-irem-u}{\mathrm{irem\_u}}_N(i_1, i_2)\)

  • 如果 \(i_2\)\(0\),则结果未定义。

  • 否则,返回 \(i_1\) 除以 \(i_2\) 的余数。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-irem-u}{\mathrm{irem\_u}}_N(i_1, 0) &=& \{\} \\ \href{../exec/numerics.html#op-irem-u}{\mathrm{irem\_u}}_N(i_1, i_2) &=& i_1 - i_2 \cdot \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(i_1 / i_2) \\ \end{array}\end{split}\]

注意

此运算符是 部分的.

只要两个运算符都已定义,则 \(i_1 = i_2\cdot\href{../exec/numerics.html#op-idiv-u}{\mathrm{idiv\_u}}(i_1, i_2) + \href{../exec/numerics.html#op-irem-u}{\mathrm{irem\_u}}(i_1, i_2)\) 成立。

\(\href{../exec/numerics.html#op-irem-s}{\mathrm{irem\_s}}_N(i_1, i_2)\)

  • \(j_1\)\(i_1\)有符号解释

  • \(j_2\)\(i_2\)有符号解释

  • 如果 \(i_2\)\(0\),则结果未定义。

  • 否则,返回 \(j_1\) 除以 \(j_2\) 的余数,其符号与被除数 \(j_1\) 相同。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-irem-s}{\mathrm{irem\_s}}_N(i_1, 0) &=& \{\} \\ \href{../exec/numerics.html#op-irem-s}{\mathrm{irem\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N^{-1}(j_1 - j_2 \cdot \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(j_1 / j_2)) \\ && (\mathrel{\mbox{where}} j_1 = \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) \wedge j_2 = \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2)) \\ \end{array}\end{split}\]

注意

此运算符是 部分的.

只要两个运算符都已定义,则 \(i_1 = i_2\cdot\href{../exec/numerics.html#op-idiv-s}{\mathrm{idiv\_s}}(i_1, i_2) + \href{../exec/numerics.html#op-irem-s}{\mathrm{irem\_s}}(i_1, i_2)\) 成立。

\(\href{../exec/numerics.html#op-inot}{\mathrm{inot}}_N(i)\)

  • 返回 \(i\) 的按位取反。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-inot}{\mathrm{inot}}_N(i) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i) \veebar \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(2^N-1)) \end{array}\]

\(\href{../exec/numerics.html#op-iand}{\mathrm{iand}}_N(i_1, i_2)\)

  • 返回 \(i_1\)\(i_2\) 的按位与。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-iand}{\mathrm{iand}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_1) \wedge \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-iandnot}{\mathrm{iandnot}}_N(i_1, i_2)\)

  • 返回 \(i_1\)\(i_2\) 的按位取反后的按位与。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-iandnot}{\mathrm{iandnot}}_N(i_1, i_2) &=& \href{../exec/numerics.html#op-iand}{\mathrm{iand}}_N(i_1, \href{../exec/numerics.html#op-inot}{\mathrm{inot}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-ior}{\mathrm{ior}}_N(i_1, i_2)\)

  • 返回 \(i_1\)\(i_2\) 的按位或。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ior}{\mathrm{ior}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_1) \vee \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-ixor}{\mathrm{ixor}}_N(i_1, i_2)\)

  • 返回 \(i_1\)\(i_2\) 的按位异或。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ixor}{\mathrm{ixor}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(\href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_1) \veebar \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-ishl}{\mathrm{ishl}}_N(i_1, i_2)\)

  • \(k\)\(i_2\)\(N\) 的结果。

  • 返回将 \(i_1\) 左移 \(k\) 位后模 \(2^N\) 的结果。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ishl}{\mathrm{ishl}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(d_2^{N-k}~0^k) & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_1) = d_1^k~d_2^{N-k} \wedge k = i_2 \mathbin{\mathrm{mod}} N) \end{array}\]

\(\href{../exec/numerics.html#op-ishr-u}{\mathrm{ishr\_u}}_N(i_1, i_2)\)

  • \(k\)\(i_2\)\(N\) 的结果。

  • 返回将 \(i_1\) 右移 \(k\) 位,并用 \(0\) 位扩展的结果。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ishr-u}{\mathrm{ishr\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(0^k~d_1^{N-k}) & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_1) = d_1^{N-k}~d_2^k \wedge k = i_2 \mathbin{\mathrm{mod}} N) \end{array}\]

\(\href{../exec/numerics.html#op-ishr-s}{\mathrm{ishr\_s}}_N(i_1, i_2)\)

  • \(k\)\(i_2\)\(N\) 的结果。

  • 返回将 \(i_1\) 右移 \(k\) 位,并用原始值的最高位扩展的结果。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ishr-s}{\mathrm{ishr\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(d_0^{k+1}~d_1^{N-k-1}) & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_1) = d_0~d_1^{N-k-1}~d_2^k \wedge k = i_2 \mathbin{\mathrm{mod}} N) \end{array}\]

\(\href{../exec/numerics.html#op-irotl}{\mathrm{irotl}}_N(i_1, i_2)\)

  • \(k\)\(i_2\)\(N\) 的结果。

  • 返回将 \(i_1\) 左旋转 \(k\) 位的结果。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-irotl}{\mathrm{irotl}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(d_2^{N-k}~d_1^k) & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_1) = d_1^k~d_2^{N-k} \wedge k = i_2 \mathbin{\mathrm{mod}} N) \end{array}\]

\(\href{../exec/numerics.html#op-irotr}{\mathrm{irotr}}_N(i_1, i_2)\)

  • \(k\)\(i_2\)\(N\) 的结果。

  • 返回将 \(i_1\) 右旋转 \(k\) 位的结果。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-irotr}{\mathrm{irotr}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N^{-1}(d_2^k~d_1^{N-k}) & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i_1) = d_1^{N-k}~d_2^k \wedge k = i_2 \mathbin{\mathrm{mod}} N) \end{array}\]

\(\href{../exec/numerics.html#op-iclz}{\mathrm{iclz}}_N(i)\)

  • 返回 \(i\) 中的最高位零位数;如果 \(i\)\(0\),则所有位都被视为最高位零位。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-iclz}{\mathrm{iclz}}_N(i) &=& k & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i) = 0^k~(1~d^\ast)^?) \end{array}\]

\(\href{../exec/numerics.html#op-ictz}{\mathrm{ictz}}_N(i)\)

  • 返回 \(i\) 中的最低位零位数;如果 \(i\)\(0\),则所有位都被视为最低位零位。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ictz}{\mathrm{ictz}}_N(i) &=& k & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i) = (d^\ast~1)^?~0^k) \end{array}\]

\(\href{../exec/numerics.html#op-ipopcnt}{\mathrm{ipopcnt}}_N(i)\)

  • 返回 \(i\) 中非零位的数量。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ipopcnt}{\mathrm{ipopcnt}}_N(i) &=& k & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-ibits}{\mathrm{ibits}}_N(i) = (0^\ast~1)^k~0^\ast) \end{array}\]

\(\href{../exec/numerics.html#op-ieqz}{\mathrm{ieqz}}_N(i)\)

  • 返回 \(1\) 如果 \(i\) 为零,否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ieqz}{\mathrm{ieqz}}_N(i) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(i = 0) \end{array}\]

\(\href{../exec/numerics.html#op-ieq}{\mathrm{ieq}}_N(i_1, i_2)\)

  • 如果 \(i_1\) 等于 \(i_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ieq}{\mathrm{ieq}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(i_1 = i_2) \end{array}\]

\(\href{../exec/numerics.html#op-ine}{\mathrm{ine}}_N(i_1, i_2)\)

  • 如果 \(i_1\) 不等于 \(i_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ine}{\mathrm{ine}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(i_1 \neq i_2) \end{array}\]

\(\href{../exec/numerics.html#op-ilt-u}{\mathrm{ilt\_u}}_N(i_1, i_2)\)

  • 如果 \(i_1\) 小于 \(i_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ilt-u}{\mathrm{ilt\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(i_1 < i_2) \end{array}\]

\(\href{../exec/numerics.html#op-ilt-s}{\mathrm{ilt\_s}}_N(i_1, i_2)\)

  • \(j_1\)\(i_1\)有符号解释

  • \(j_2\)\(i_2\)有符号解释

  • 如果 \(j_1\) 小于 \(j_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ilt-s}{\mathrm{ilt\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) < \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-igt-u}{\mathrm{igt\_u}}_N(i_1, i_2)\)

  • 如果 \(i_1\) 大于 \(i_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-igt-u}{\mathrm{igt\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(i_1 > i_2) \end{array}\]

\(\href{../exec/numerics.html#op-igt-s}{\mathrm{igt\_s}}_N(i_1, i_2)\)

  • \(j_1\)\(i_1\)有符号解释

  • \(j_2\)\(i_2\)有符号解释

  • 如果 \(j_1\) 大于 \(j_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-igt-s}{\mathrm{igt\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) > \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-ile-u}{\mathrm{ile\_u}}_N(i_1, i_2)\)

  • 如果 \(i_1\) 小于或等于 \(i_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ile-u}{\mathrm{ile\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(i_1 \leq i_2) \end{array}\]

\(\href{../exec/numerics.html#op-ile-s}{\mathrm{ile\_s}}_N(i_1, i_2)\)

  • \(j_1\)\(i_1\)有符号解释

  • \(j_2\)\(i_2\)有符号解释

  • 如果 \(j_1\) 小于或等于 \(j_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ile-s}{\mathrm{ile\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) \leq \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-ige-u}{\mathrm{ige\_u}}_N(i_1, i_2)\)

  • 如果 \(i_1\) 大于或等于 \(i_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ige-u}{\mathrm{ige\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(i_1 \geq i_2) \end{array}\]

\(\href{../exec/numerics.html#op-ige-s}{\mathrm{ige\_s}}_N(i_1, i_2)\)

  • \(j_1\)\(i_1\)有符号解释

  • \(j_2\)\(i_2\)有符号解释

  • 如果 \(j_1\) 大于或等于 \(j_2\),则返回 \(1\),否则返回 \(0\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ige-s}{\mathrm{ige\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) \geq \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-iextendn-s}{\mathrm{iextend}M\mathrm{\_s}}_N(i)\)

  • \(j\) 为计算 \(\href{../exec/numerics.html#op-wrap}{\mathrm{wrap}}_{N,M}(i)\) 的结果。

  • 返回 \(\href{../exec/numerics.html#op-extend-s}{\mathrm{extend}^{\mathsf{s}}}_{M,N}(j)\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-iextendn-s}{\mathrm{iextend}M\mathrm{\_s}}_{N}(i) &=& \href{../exec/numerics.html#op-extend-s}{\mathrm{extend}^{\mathsf{s}}}_{M,N}(\href{../exec/numerics.html#op-wrap}{\mathrm{wrap}}_{N,M}(i)) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-ibitselect}{\mathrm{ibitselect}}_N(i_1, i_2, i_3)\)

  • \(j_1\)\(i_1\)\(i_3\) 的按位与运算。

  • \(j_3'\)\(i_3\) 的按位取反。

  • \(j_2\)\(i_2\)\(j_3'\) 的按位与运算。

  • 返回 \(j_1\)\(j_2\) 的按位或运算。

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ibitselect}{\mathrm{ibitselect}}_N(i_1, i_2, i_3) &=& \href{../exec/numerics.html#op-ior}{\mathrm{ior}}_N(\href{../exec/numerics.html#op-iand}{\mathrm{iand}}_N(i_1, i_3), \href{../exec/numerics.html#op-iand}{\mathrm{iand}}_N(i_2, \href{../exec/numerics.html#op-inot}{\mathrm{inot}}_N(i_3))) \end{array}\]

\(\href{../exec/numerics.html#op-iabs}{\mathrm{iabs}}_N(i)\)

  • \(j\)\(i\)有符号解释

  • 如果 \(j\) 大于或等于 \(0\),则返回 \(i\)

  • 否则返回 j 的负数,模 \(2^N\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-iabs}{\mathrm{iabs}}_N(i) &=& i & (\mathrel{\mbox{if}} \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i) \ge 0) \\ \href{../exec/numerics.html#op-iabs}{\mathrm{iabs}}_N(i) &=& -\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i) \mathbin{\mathrm{mod}} 2^N & (\mathrel{\mbox{otherwise}}) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-ineg}{\mathrm{ineg}}_N(i)\)

  • 返回对 \(i\) 取反的结果,模 \(2^N\)

\[\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ineg}{\mathrm{ineg}}_N(i) &=& (2^N - i) \mathbin{\mathrm{mod}} 2^N \end{array}\]

\(\href{../exec/numerics.html#op-imin-u}{\mathrm{imin\_u}}_N(i_1, i_2)\)

  • 如果 \(\href{../exec/numerics.html#op-ilt-u}{\mathrm{ilt\_u}}_N(i_1, i_2)\)\(1\),则返回 \(i_1\),否则返回 \(i_2\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-imin-u}{\mathrm{imin\_u}}_N(i_1, i_2) &=& i_1 & (\mathrel{\mbox{if}} \href{../exec/numerics.html#op-ilt-u}{\mathrm{ilt\_u}}_N(i_1, i_2) = 1)\\ \href{../exec/numerics.html#op-imin-u}{\mathrm{imin\_u}}_N(i_1, i_2) &=& i_2 & (\mathrel{\mbox{otherwise}}) \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-imin-s}{\mathrm{imin\_s}}_N(i_1, i_2)\)

  • 如果 \(\href{../exec/numerics.html#op-ilt-s}{\mathrm{ilt\_s}}_N(i_1, i_2)\)\(1\),则返回 \(i_1\),否则返回 \(i_2\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-imin-s}{\mathrm{imin\_s}}_N(i_1, i_2) &=& i_1 & (\mathrel{\mbox{if}} \href{../exec/numerics.html#op-ilt-s}{\mathrm{ilt\_s}}_N(i_1, i_2) = 1)\\ \href{../exec/numerics.html#op-imin-s}{\mathrm{imin\_s}}_N(i_1, i_2) &=& i_2 & (\mathrel{\mbox{otherwise}}) \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-imax-u}{\mathrm{imax\_u}}_N(i_1, i_2)\)

  • 如果 \(\href{../exec/numerics.html#op-igt-u}{\mathrm{igt\_u}}_N(i_1, i_2)\)\(1\),则返回 \(i_1\),否则返回 \(i_2\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-imax-u}{\mathrm{imax\_u}}_N(i_1, i_2) &=& i_1 & (\mathrel{\mbox{if}} \href{../exec/numerics.html#op-igt-u}{\mathrm{igt\_u}}_N(i_1, i_2) = 1)\\ \href{../exec/numerics.html#op-imax-u}{\mathrm{imax\_u}}_N(i_1, i_2) &=& i_2 & (\mathrel{\mbox{otherwise}}) \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-imax-s}{\mathrm{imax\_s}}_N(i_1, i_2)\)

  • 如果 \(\href{../exec/numerics.html#op-igt-s}{\mathrm{igt\_s}}_N(i_1, i_2)\)\(1\),则返回 \(i_1\),否则返回 \(i_2\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-imax-s}{\mathrm{imax\_s}}_N(i_1, i_2) &=& i_1 & (\mathrel{\mbox{if}} \href{../exec/numerics.html#op-igt-s}{\mathrm{igt\_s}}_N(i_1, i_2) = 1)\\ \href{../exec/numerics.html#op-imax-s}{\mathrm{imax\_s}}_N(i_1, i_2) &=& i_2 & (\mathrel{\mbox{otherwise}}) \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-iadd-sat-u}{\mathrm{iadd\_sat\_u}}_N(i_1, i_2)\)

  • \(i\)\(i_1\)\(i_2\) 相加的结果。

  • 返回 \(\href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i)\)

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-iadd-sat-u}{\mathrm{iadd\_sat\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i_1 + i_2) \end{array}\]

\(\href{../exec/numerics.html#op-iadd-sat-s}{\mathrm{iadd\_sat\_s}}_N(i_1, i_2)\)

  • \(j_1\)\(i_1\) 的有符号解释。

  • \(j_2\)\(i_2\) 的有符号解释。

  • \(j\)\(j_1\)\(j_2\) 相加的结果。

  • 返回 \(\href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(j)\)

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-iadd-sat-s}{\mathrm{iadd\_sat\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) + \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-isub-sat-u}{\mathrm{isub\_sat\_u}}_N(i_1, i_2)\)

  • \(i\) 为从 \(i_1\) 中减去 \(i_2\) 的结果。

  • 返回 \(\href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i)\)

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-isub-sat-u}{\mathrm{isub\_sat\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(i_1 - i_2) \end{array}\]

\(\href{../exec/numerics.html#op-isub-sat-s}{\mathrm{isub\_sat\_s}}_N(i_1, i_2)\)

  • \(j_1\)\(i_1\) 的有符号解释。

  • \(j_2\)\(i_2\) 的有符号解释。

  • \(j\) 为从 \(j_1\) 中减去 \(j_2\) 的结果。

  • 返回 \(\href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(j)\)

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-isub-sat-s}{\mathrm{isub\_sat\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_1) - \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N(i_2)) \end{array}\]

\(\href{../exec/numerics.html#op-iavgr-u}{\mathrm{iavgr\_u}}_N(i_1, i_2)\)

  • \(j\)\(i_1\)\(i_2\)\(1\) 相加的结果。

  • 返回 \(j\) 除以 \(2\) 的结果,向零截断。

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-iavgr-u}{\mathrm{iavgr\_u}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}((i_1 + i_2 + 1) / 2) \end{array}\]

\(\href{../exec/numerics.html#op-iq15mulrsat-s}{\mathrm{iq15mulrsat\_s}}_N(i_1, i_2)\)

  • 返回 \(\href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(\href{../exec/numerics.html#op-ishr-s}{\mathrm{ishr\_s}}_N(i_1 \cdot i_2 + 2^{14}, 15))\) 的结果。

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-iq15mulrsat-s}{\mathrm{iq15mulrsat\_s}}_N(i_1, i_2) &=& \href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(\href{../exec/numerics.html#op-ishr-s}{\mathrm{ishr\_s}}_N(i_1 \cdot i_2 + 2^{14}, 15)) \end{array}\]

浮点运算

浮点运算遵循 IEEE 754 标准,并具有以下限定条件。

  • 所有运算符使用舍入到最接近的偶数,除非另有说明。不支持非默认的定向舍入属性。

  • 遵循运算符从其操作数传播 NaN 负载的建议是允许的,但不是必需的。

  • 所有运算符使用“不停”模式,浮点异常不会以其他方式被观察到。特别地,不支持备用浮点异常处理属性或状态标志上的运算符。静默 NaN 和信号 NaN 之间没有可观察到的区别。

注意

WebAssembly 的未来版本可能会消除其中的一些限制。

舍入

舍入总是舍入到最接近的偶数,对应于 IEEE 754(第 4.3.1 节)。

一个精确的浮点数是一个有理数,它可以精确地表示为给定位宽 \(N\)浮点数

给定浮点位宽 \(N\)极限数是一个正数或负数,其大小是最小的 2 的幂,它不能精确地表示为位宽为 \(N\) 的浮点数(对于 \(N = 32\),该大小为 \(2^{128}\),对于 \(N = 64\),该大小为 \(2^{1024}\))。

一个候选数是一个精确的浮点数或给定位宽 \(N\) 的正数或负数极限数。

一个候选对是一对候选数 \(z_1,z_2\),使得不存在位于两者之间的候选数。

实数 \(r\) 转换为位宽为 \(N\) 的浮点值,如下所示。

  • 如果 \(r\)\(0\),则返回 \(+0\)

  • 否则,如果 \(r\) 是一个精确的浮点数,则返回 \(r\)

  • 否则,如果 \(r\) 大于或等于正极限,则返回 \(+\infty\)

  • 否则,如果 \(r\) 小于或等于负极限,则返回 \(-\infty\)

  • 否则,如果 \(z_1\)\(z_2\) 是一个候选对,使得 \(z_1 < r < z_2\),则

    • 如果 \(|r - z_1| < |r - z_2|\),则令 \(z\)\(z_1\)

    • 否则,如果 \(|r - z_1| > |r - z_2|\),则令 \(z\)\(z_2\)

    • 否则,如果 \(|r - z_1| = |r - z_2|\) 并且 \(z_1\)尾数 是偶数,则令 \(z\)\(z_1\)

    • 否则,令 \(z\)\(z_2\)

  • 如果 \(z\)\(0\),则

    • 如果 \(r < 0\),则返回 \(-0\)

    • 否则,返回 \(+0\)

  • 否则,如果 \(z\) 是一个极限数,则

    • 如果 \(r < 0\),则返回 \(-\infty\)

    • 否则,返回 \(+\infty\)

  • 否则,返回 \(z\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(0) &=& +0 \\ \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(r) &=& r & (\mathrel{\mbox{if}} r \in \mathrm{exact}_N) \\ \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(r) &=& +\infty & (\mathrel{\mbox{if}} r \geq +\mathrm{limit}_N) \\ \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(r) &=& -\infty & (\mathrel{\mbox{if}} r \leq -\mathrm{limit}_N) \\ \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(r) &=& \mathrm{closest}_N(r, z_1, z_2) & (\mathrel{\mbox{if}} z_1 < r < z_2 \wedge (z_1,z_2) \in \mathrm{candidatepair}_N) \\[1ex] \mathrm{closest}_N(r, z_1, z_2) &=& \mathrm{rectify}_N(r, z_1) & (\mathrel{\mbox{if}} |r-z_1|<|r-z_2|) \\ \mathrm{closest}_N(r, z_1, z_2) &=& \mathrm{rectify}_N(r, z_2) & (\mathrel{\mbox{if}} |r-z_1|>|r-z_2|) \\ \mathrm{closest}_N(r, z_1, z_2) &=& \mathrm{rectify}_N(r, z_1) & (\mathrel{\mbox{if}} |r-z_1|=|r-z_2| \wedge \mathrm{even}_N(z_1)) \\ \mathrm{closest}_N(r, z_1, z_2) &=& \mathrm{rectify}_N(r, z_2) & (\mathrel{\mbox{if}} |r-z_1|=|r-z_2| \wedge \mathrm{even}_N(z_2)) \\[1ex] \mathrm{rectify}_N(r, \pm \mathrm{limit}_N) &=& \pm \infty \\ \mathrm{rectify}_N(r, 0) &=& +0 \qquad (r \geq 0) \\ \mathrm{rectify}_N(r, 0) &=& -0 \qquad (r < 0) \\ \mathrm{rectify}_N(r, z) &=& z \\ \end{array}\end{split}\]

其中

\[\begin{split}\begin{array}{lll@{\qquad}l} \mathrm{exact}_N &=& \href{../syntax/values.html#syntax-float}{\mathit{f}N} \cap \mathbb{Q} \\ \mathrm{limit}_N &=& 2^{2^{\href{../syntax/values.html#aux-exponent}{\mathrm{expon}}(N)-1}} \\ \mathrm{candidate}_N &=& \mathrm{exact}_N \cup \{+\mathrm{limit}_N, -\mathrm{limit}_N\} \\ \mathrm{candidatepair}_N &=& \{ (z_1, z_2) \in \mathrm{candidate}_N^2 ~|~ z_1 < z_2 \wedge \forall z \in \mathrm{candidate}_N, z \leq z_1 \vee z \geq z_2\} \\[1ex] \mathrm{even}_N((d + m\cdot 2^{-M}) \cdot 2^e) &\Leftrightarrow& m \mathbin{\mathrm{mod}} 2 = 0 \\ \mathrm{even}_N(\pm \mathrm{limit}_N) &\Leftrightarrow& \mathrm{true} \\ \end{array}\end{split}\]

NaN 传播

\(\href{../exec/numerics.html#op-fneg}{\mathrm{fneg}}\)\(\href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}\)\(\href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}\) 以外的浮点运算符的结果是 NaN 时,它的符号是非确定性的,并且 负载 按如下方式计算。

  • 如果运算符的所有 NaN 输入的负载是 规范的(包括没有 NaN 输入的情况),那么输出的负载也是规范的。

  • 否则,负载会在所有 算术 NaN 中非确定性地选择;也就是说,它的最高有效位是 \(1\),其他位都是未指定的。

这种非确定性结果由以下辅助函数表示,该函数从一组输入中产生一组允许的输出。

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z^\ast\} &=& \{ + \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), - \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n) ~|~ n = \href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N \} & (\mathrel{\mbox{if}} \forall \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n) \in z^\ast,~ n = \href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N) \\ \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z^\ast\} &=& \{ + \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), - \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n) ~|~ n \geq \href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N \} & (\mathrel{\mbox{otherwise}}) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z_1, z_2\}\) 中的一个元素。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相反的无穷大,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\}\) 中的一个元素。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相同的无穷大,则返回该无穷大。

  • 否则,如果 \(z_1\)\(z_2\) 是无穷大,则返回该无穷大。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相反的零,则返回正零。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相同的零,则返回该零。

  • 否则,如果 \(z_1\)\(z_2\) 是零,则返回另一个操作数。

  • 否则,如果 \(z_1\)\(z_2\) 都是大小相同但符号相反的值,则返回正零。

  • 否则,返回将 \(z_1\)\(z_2\) 相加的结果,四舍五入 到最接近的可表示值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2\} \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_1\} \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(\pm \infty, \mp \infty) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(\pm \infty, \pm \infty) &=& \pm \infty \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(z_1, \pm \infty) &=& \pm \infty \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(\pm \infty, z_2) &=& \pm \infty \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(\pm 0, \mp 0) &=& +0 \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(\pm 0, \pm 0) &=& \pm 0 \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(z_1, \pm 0) &=& z_1 \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(\pm 0, z_2) &=& z_2 \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(\pm q, \mp q) &=& +0 \\ \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(z_1 + z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z_1, z_2\}\) 中的一个元素。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相同的无穷大,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\}\) 中的一个元素。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相反的无穷大,则返回 \(z_1\)

  • 否则,如果 \(z_1\) 是无穷大,则返回该无穷大。

  • 否则,如果 \(z_2\) 是无穷大,则返回该无穷大的相反数。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相同的零,则返回正零。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相反的零,则返回 \(z_1\)

  • 否则,如果 \(z_2\) 是零,则返回 \(z_1\)

  • 否则,如果 \(z_1\) 是零,则返回 \(z_2\) 的相反数。

  • 否则,如果 \(z_1\)\(z_2\) 是相同的值,则返回正零。

  • 否则,返回将 \(z_2\)\(z_1\) 中减去的结果,四舍五入 到最接近的可表示值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2\} \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_1\} \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(\pm \infty, \pm \infty) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(\pm \infty, \mp \infty) &=& \pm \infty \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(z_1, \pm \infty) &=& \mp \infty \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(\pm \infty, z_2) &=& \pm \infty \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(\pm 0, \pm 0) &=& +0 \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(\pm 0, \mp 0) &=& \pm 0 \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(z_1, \pm 0) &=& z_1 \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(\pm 0, \pm q_2) &=& \mp q_2 \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(\pm q, \pm q) &=& +0 \\ \href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(z_1 - z_2) \\ \end{array}\end{split}\]

注意

除了 NaN 的不确定性外,始终满足 \(\href{../exec/numerics.html#op-fsub}{\mathrm{fsub}}_N(z_1, z_2) = \href{../exec/numerics.html#op-fadd}{\mathrm{fadd}}_N(z_1, \href{../exec/numerics.html#op-fneg}{\mathrm{fneg}}_N(z_2))\)

\(\href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z_1, z_2\}\) 中的一个元素。

  • 否则,如果 \(z_1\)\(z_2\) 中一个是零,另一个是无穷大,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\}\) 中的一个元素。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相同的无穷大,则返回正无穷大。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相反的无穷大,则返回负无穷大。

  • 否则,如果 \(z_1\)\(z_2\) 是无穷大,另一个是符号相同的数值,则返回正无穷大。

  • 否则,如果 \(z_1\)\(z_2\) 是无穷大,另一个是符号相反的数值,则返回负无穷大。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相同的零,则返回正零。

  • 否则,如果 \(z_1\)\(z_2\) 都是符号相反的零,则返回负零。

  • 否则,返回将 \(z_1\)\(z_2\) 相乘的结果,四舍五入 到最接近的可表示值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2\} \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_1\} \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm \infty, \pm 0) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm \infty, \mp 0) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm 0, \pm \infty) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm 0, \mp \infty) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm \infty, \pm \infty) &=& +\infty \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm \infty, \mp \infty) &=& -\infty \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm q_1, \pm \infty) &=& +\infty \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm q_1, \mp \infty) &=& -\infty \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm \infty, \pm q_2) &=& +\infty \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm \infty, \mp q_2) &=& -\infty \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm 0, \pm 0) &=& + 0 \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(\pm 0, \mp 0) &=& - 0 \\ \href{../exec/numerics.html#op-fmul}{\mathrm{fmul}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(z_1 \cdot z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z_1, z_2\}\) 中的一个元素。

  • 否则,如果 \(z_1\)\(z_2\) 都是无穷大,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\}\) 中的一个元素。

  • 否则,如果 \(z_1\)\(z_2\) 都是零,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z_1, z_2\}\) 中的一个元素。

  • 否则,如果 \(z_1\) 是无穷大,\(z_2\) 是符号相同的数值,则返回正无穷大。

  • 否则,如果 \(z_1\) 是无穷大,\(z_2\) 是符号相反的数值,则返回负无穷大。

  • 否则,如果 \(z_2\) 是无穷大,\(z_1\) 是符号相同的数值,则返回正零。

  • 否则,如果 \(z_2\) 是无穷大,\(z_1\) 是符号相反的数值,则返回负零。

  • 否则,如果 \(z_1\) 是零,\(z_2\) 是符号相同的数值,则返回正零。

  • 否则,如果 \(z_1\) 是零,\(z_2\) 是符号相反的数值,则返回负零。

  • 否则,如果 \(z_2\) 是零,\(z_1\) 是符号相同的数值,则返回正无穷大。

  • 否则,如果 \(z_2\) 是零,\(z_1\) 是符号相反的数值,则返回负无穷大。

  • 否则,返回将 \(z_1\) 除以 \(z_2\) 的结果,四舍五入 到最接近的可表示值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2\} \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_1\} \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm \infty, \pm \infty) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm \infty, \mp \infty) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm 0, \pm 0) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm 0, \mp 0) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm \infty, \pm q_2) &=& +\infty \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm \infty, \mp q_2) &=& -\infty \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm q_1, \pm \infty) &=& +0 \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm q_1, \mp \infty) &=& -0 \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm 0, \pm q_2) &=& +0 \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm 0, \mp q_2) &=& -0 \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm q_1, \pm 0) &=& +\infty \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(\pm q_1, \mp 0) &=& -\infty \\ \href{../exec/numerics.html#op-fdiv}{\mathrm{fdiv}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(z_1 / z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z_1, z_2\}\) 中的一个元素。

  • 如果 \(z_1\)\(z_2\) 为负无穷大,则返回负无穷大。

  • 如果 \(z_1\)\(z_2\) 为正无穷大,则返回另一个值。

  • 如果 \(z_1\)\(z_2\) 都是符号相反的零,则返回负零。

  • 否则返回 \(z_1\)\(z_2\) 中较小的值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2\} \\ \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_1\} \\ \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(+ \infty, z_2) &=& z_2 \\ \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(- \infty, z_2) &=& - \infty \\ \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(z_1, + \infty) &=& z_1 \\ \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(z_1, - \infty) &=& - \infty \\ \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(\pm 0, \mp 0) &=& -0 \\ \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(z_1, z_2) &=& z_1 & (\mathrel{\mbox{if}} z_1 \leq z_2) \\ \href{../exec/numerics.html#op-fmin}{\mathrm{fmin}}_N(z_1, z_2) &=& z_2 & (\mathrel{\mbox{if}} z_2 \leq z_1) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z_1, z_2\}\) 中的一个元素。

  • 如果 \(z_1\)\(z_2\) 为正无穷大,则返回正无穷大。

  • 如果 \(z_1\)\(z_2\) 为负无穷大,则返回另一个值。

  • 如果 \(z_1\)\(z_2\) 都是符号相反的零,则返回正零。

  • 否则返回 \(z_1\)\(z_2\) 中较大的值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2\} \\ \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_1\} \\ \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(+ \infty, z_2) &=& + \infty \\ \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(- \infty, z_2) &=& z_2 \\ \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(z_1, + \infty) &=& + \infty \\ \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(z_1, - \infty) &=& z_1 \\ \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(\pm 0, \mp 0) &=& +0 \\ \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(z_1, z_2) &=& z_1 & (\mathrel{\mbox{if}} z_1 \geq z_2) \\ \href{../exec/numerics.html#op-fmax}{\mathrm{fmax}}_N(z_1, z_2) &=& z_2 & (\mathrel{\mbox{if}} z_2 \geq z_1) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 的符号相同,则返回 \(z_1\)

  • 否则返回符号取反的 \(z_1\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(\pm p_1, \pm p_2) &=& \pm p_1 \\ \href{../exec/numerics.html#op-fcopysign}{\mathrm{fcopysign}}_N(\pm p_1, \mp p_2) &=& \mp p_1 \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}_N(z)\)

  • 如果 \(z\) 是 NaN,则返回符号为正的 \(z\)

  • 如果 \(z\) 是无穷大,则返回正无穷大。

  • 如果 \(z\) 是零,则返回正零。

  • 如果 \(z\) 是正值,则返回 \(z\)

  • 否则返回符号取反的 \(z\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& +\href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n) \\ \href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}_N(\pm \infty) &=& +\infty \\ \href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}_N(\pm 0) &=& +0 \\ \href{../exec/numerics.html#op-fabs}{\mathrm{fabs}}_N(\pm q) &=& +q \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fneg}{\mathrm{fneg}}_N(z)\)

  • 如果 \(z\) 是 NaN,则返回符号取反的 \(z\)

  • 如果 \(z\) 是无穷大,则返回符号取反的无穷大。

  • 如果 \(z\) 是零,则返回符号取反的零。

  • 否则返回符号取反的 \(z\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fneg}{\mathrm{fneg}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \mp \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n) \\ \href{../exec/numerics.html#op-fneg}{\mathrm{fneg}}_N(\pm \infty) &=& \mp \infty \\ \href{../exec/numerics.html#op-fneg}{\mathrm{fneg}}_N(\pm 0) &=& \mp 0 \\ \href{../exec/numerics.html#op-fneg}{\mathrm{fneg}}_N(\pm q) &=& \mp q \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fsqrt}{\mathrm{fsqrt}}_N(z)\)

  • 如果 \(z\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z\}\) 中的一个元素。

  • 如果 \(z\) 是负无穷大,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\}\) 中的一个元素。

  • 如果 \(z\) 是正无穷大,则返回正无穷大。

  • 如果 \(z\) 是零,则返回该零。

  • 如果 \(z\) 的符号为负,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\}\) 中的一个元素。

  • 否则返回 \(z\) 的平方根。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fsqrt}{\mathrm{fsqrt}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)\} \\ \href{../exec/numerics.html#op-fsqrt}{\mathrm{fsqrt}}_N(- \infty) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fsqrt}{\mathrm{fsqrt}}_N(+ \infty) &=& + \infty \\ \href{../exec/numerics.html#op-fsqrt}{\mathrm{fsqrt}}_N(\pm 0) &=& \pm 0 \\ \href{../exec/numerics.html#op-fsqrt}{\mathrm{fsqrt}}_N(- q) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} \\ \href{../exec/numerics.html#op-fsqrt}{\mathrm{fsqrt}}_N(+ q) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N\left(\sqrt{q}\right) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fceil}{\mathrm{fceil}}_N(z)\)

  • 如果 \(z\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z\}\) 中的一个元素。

  • 如果 \(z\) 是无穷大,则返回 \(z\)

  • 如果 \(z\) 是零,则返回 \(z\)

  • 如果 \(z\) 小于 \(0\) 但大于 \(-1\),则返回负零。

  • 否则返回不小于 \(z\) 的最小整数值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fceil}{\mathrm{fceil}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)\} \\ \href{../exec/numerics.html#op-fceil}{\mathrm{fceil}}_N(\pm \infty) &=& \pm \infty \\ \href{../exec/numerics.html#op-fceil}{\mathrm{fceil}}_N(\pm 0) &=& \pm 0 \\ \href{../exec/numerics.html#op-fceil}{\mathrm{fceil}}_N(- q) &=& -0 & (\mathrel{\mbox{if}} -1 < -q < 0) \\ \href{../exec/numerics.html#op-fceil}{\mathrm{fceil}}_N(\pm q) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(i) & (\mathrel{\mbox{if}} \pm q \leq i < \pm q + 1) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-ffloor}{\mathrm{ffloor}}_N(z)\)

  • 如果 \(z\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z\}\) 中的一个元素。

  • 如果 \(z\) 是无穷大,则返回 \(z\)

  • 如果 \(z\) 是零,则返回 \(z\)

  • 如果 \(z\) 大于 \(0\) 但小于 \(1\),则返回正零。

  • 否则返回不大于 \(z\) 的最大整数值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ffloor}{\mathrm{ffloor}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)\} \\ \href{../exec/numerics.html#op-ffloor}{\mathrm{ffloor}}_N(\pm \infty) &=& \pm \infty \\ \href{../exec/numerics.html#op-ffloor}{\mathrm{ffloor}}_N(\pm 0) &=& \pm 0 \\ \href{../exec/numerics.html#op-ffloor}{\mathrm{ffloor}}_N(+ q) &=& +0 & (\mathrel{\mbox{if}} 0 < +q < 1) \\ \href{../exec/numerics.html#op-ffloor}{\mathrm{ffloor}}_N(\pm q) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(i) & (\mathrel{\mbox{if}} \pm q - 1 < i \leq \pm q) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-ftrunc}{\mathrm{ftrunc}}_N(z)\)

  • 如果 \(z\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z\}\) 中的一个元素。

  • 如果 \(z\) 是无穷大,则返回 \(z\)

  • 如果 \(z\) 是零,则返回 \(z\)

  • 如果 \(z\) 大于 \(0\) 但小于 \(1\),则返回正零。

  • 如果 \(z\) 小于 \(0\) 但大于 \(-1\),则返回负零。

  • 否则返回与 \(z\) 符号相同且大小不大于 \(z\) 大小的最大整数值。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-ftrunc}{\mathrm{ftrunc}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)\} \\ \href{../exec/numerics.html#op-ftrunc}{\mathrm{ftrunc}}_N(\pm \infty) &=& \pm \infty \\ \href{../exec/numerics.html#op-ftrunc}{\mathrm{ftrunc}}_N(\pm 0) &=& \pm 0 \\ \href{../exec/numerics.html#op-ftrunc}{\mathrm{ftrunc}}_N(+ q) &=& +0 & (\mathrel{\mbox{if}} 0 < +q < 1) \\ \href{../exec/numerics.html#op-ftrunc}{\mathrm{ftrunc}}_N(- q) &=& -0 & (\mathrel{\mbox{if}} -1 < -q < 0) \\ \href{../exec/numerics.html#op-ftrunc}{\mathrm{ftrunc}}_N(\pm q) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(\pm i) & (\mathrel{\mbox{if}} +q - 1 < i \leq +q) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fnearest}{\mathrm{fnearest}}_N(z)\)

  • 如果 \(z\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{z\}\) 中的一个元素。

  • 如果 \(z\) 是无穷大,则返回 \(z\)

  • 如果 \(z\) 是零,则返回 \(z\)

  • 如果 \(z\) 大于 \(0\) 但小于或等于 \(0.5\),则返回正零。

  • 如果 \(z\) 小于 \(0\) 但大于或等于 \(-0.5\),则返回负零。

  • 否则返回最接近 \(z\) 的整数;如果两个值距离相等,则返回偶数。

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fnearest}{\mathrm{fnearest}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)\} \\ \href{../exec/numerics.html#op-fnearest}{\mathrm{fnearest}}_N(\pm \infty) &=& \pm \infty \\ \href{../exec/numerics.html#op-fnearest}{\mathrm{fnearest}}_N(\pm 0) &=& \pm 0 \\ \href{../exec/numerics.html#op-fnearest}{\mathrm{fnearest}}_N(+ q) &=& +0 & (\mathrel{\mbox{if}} 0 < +q \leq 0.5) \\ \href{../exec/numerics.html#op-fnearest}{\mathrm{fnearest}}_N(- q) &=& -0 & (\mathrel{\mbox{if}} -0.5 \leq -q < 0) \\ \href{../exec/numerics.html#op-fnearest}{\mathrm{fnearest}}_N(\pm q) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(\pm i) & (\mathrel{\mbox{if}} |i - q| < 0.5) \\ \href{../exec/numerics.html#op-fnearest}{\mathrm{fnearest}}_N(\pm q) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(\pm i) & (\mathrel{\mbox{if}} |i - q| = 0.5 \wedge i~\mbox{even}) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-feq}{\mathrm{feq}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(0\)

  • 如果 \(z_1\)\(z_2\) 都是零,则返回 \(1\)

  • 如果 \(z_1\)\(z_2\) 是相同的值,则返回 \(1\)

  • 否则返回 \(0\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-feq}{\mathrm{feq}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& 0 \\ \href{../exec/numerics.html#op-feq}{\mathrm{feq}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& 0 \\ \href{../exec/numerics.html#op-feq}{\mathrm{feq}}_N(\pm 0, \mp 0) &=& 1 \\ \href{../exec/numerics.html#op-feq}{\mathrm{feq}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(z_1 = z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fne}{\mathrm{fne}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(1\)

  • 如果 \(z_1\)\(z_2\) 都是零,则返回 \(0\)

  • 如果 \(z_1\)\(z_2\) 是相同的值,则返回 \(0\)

  • 否则返回 \(1\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fne}{\mathrm{fne}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& 1 \\ \href{../exec/numerics.html#op-fne}{\mathrm{fne}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& 1 \\ \href{../exec/numerics.html#op-fne}{\mathrm{fne}}_N(\pm 0, \mp 0) &=& 0 \\ \href{../exec/numerics.html#op-fne}{\mathrm{fne}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(z_1 \neq z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(0\)

  • 如果 \(z_1\)\(z_2\) 是相同的值,则返回 \(0\)

  • 如果 \(z_1\) 是正无穷大,则返回 \(0\)

  • 如果 \(z_1\) 是负无穷大,则返回 \(1\)

  • 如果 \(z_2\) 是正无穷大,则返回 \(1\)

  • 如果 \(z_2\) 是负无穷大,则返回 \(0\)

  • 如果 \(z_1\)\(z_2\) 都是零,则返回 \(0\)

  • 如果 \(z_1\) 小于 \(z_2\),则返回 \(1\)

  • 否则返回 \(0\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& 0 \\ \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& 0 \\ \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(z, z) &=& 0 \\ \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(+ \infty, z_2) &=& 0 \\ \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(- \infty, z_2) &=& 1 \\ \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(z_1, + \infty) &=& 1 \\ \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(z_1, - \infty) &=& 0 \\ \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(\pm 0, \mp 0) &=& 0 \\ \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(z_1 < z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(0\)

  • 如果 \(z_1\)\(z_2\) 是相同的值,则返回 \(0\)

  • 如果 \(z_1\) 是正无穷大,则返回 \(1\)

  • 如果 \(z_1\) 是负无穷大,则返回 \(0\)

  • 如果 \(z_2\) 是正无穷大,则返回 \(0\)

  • 如果 \(z_2\) 是负无穷大,则返回 \(1\)

  • 如果 \(z_1\)\(z_2\) 都是零,则返回 \(0\)

  • 如果 \(z_1\) 大于 \(z_2\),则返回 \(1\)

  • 否则返回 \(0\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& 0 \\ \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& 0 \\ \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(z, z) &=& 0 \\ \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(+ \infty, z_2) &=& 1 \\ \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(- \infty, z_2) &=& 0 \\ \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(z_1, + \infty) &=& 0 \\ \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(z_1, - \infty) &=& 1 \\ \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(\pm 0, \mp 0) &=& 0 \\ \href{../exec/numerics.html#op-fgt}{\mathrm{fgt}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(z_1 > z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(0\)

  • 如果 \(z_1\)\(z_2\) 是相同的值,则返回 \(1\)

  • 如果 \(z_1\) 是正无穷大,则返回 \(0\)

  • 如果 \(z_1\) 是负无穷大,则返回 \(1\)

  • 如果 \(z_2\) 是正无穷大,则返回 \(1\)

  • 如果 \(z_2\) 是负无穷大,则返回 \(0\)

  • 如果 \(z_1\)\(z_2\) 都是零,则返回 \(1\)

  • 如果 \(z_1\) 小于或等于 \(z_2\),则返回 \(1\)

  • 否则返回 \(0\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& 0 \\ \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& 0 \\ \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(z, z) &=& 1 \\ \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(+ \infty, z_2) &=& 0 \\ \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(- \infty, z_2) &=& 1 \\ \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(z_1, + \infty) &=& 1 \\ \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(z_1, - \infty) &=& 0 \\ \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(\pm 0, \mp 0) &=& 1 \\ \href{../exec/numerics.html#op-fle}{\mathrm{fle}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(z_1 \leq z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(z_1, z_2)\)

  • 如果 \(z_1\)\(z_2\) 是 NaN,则返回 \(0\)

  • 如果 \(z_1\)\(z_2\) 是相同的值,则返回 \(1\)

  • 如果 \(z_1\) 是正无穷大,则返回 \(1\)

  • 如果 \(z_1\) 是负无穷大,则返回 \(0\)

  • 如果 \(z_2\) 是正无穷大,则返回 \(0\)

  • 如果 \(z_2\) 是负无穷大,则返回 \(1\)

  • 如果 \(z_1\)\(z_2\) 都是零,则返回 \(1\)

  • 如果 \(z_1\) 小于或等于 \(z_2\),则返回 \(1\)

  • 否则返回 \(0\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n), z_2) &=& 0 \\ \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(z_1, \pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& 0 \\ \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(z, z) &=& 1 \\ \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(+ \infty, z_2) &=& 1 \\ \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(- \infty, z_2) &=& 0 \\ \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(z_1, + \infty) &=& 0 \\ \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(z_1, - \infty) &=& 1 \\ \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(\pm 0, \mp 0) &=& 1 \\ \href{../exec/numerics.html#op-fge}{\mathrm{fge}}_N(z_1, z_2) &=& \href{../exec/numerics.html#aux-bool}{\mathrm{bool}}(z_1 \geq z_2) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fpmin}{\mathrm{fpmin}}_N(z_1, z_2)\)

  • 如果 \(z_2\) 小于 \(z_1\),则返回 \(z_2\)

  • 否则返回 \(z_1\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fpmin}{\mathrm{fpmin}}_N(z_1, z_2) &=& z_2 & (\mathrel{\mbox{if}} \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(z_2, z_1) = 1) \\ \href{../exec/numerics.html#op-fpmin}{\mathrm{fpmin}}_N(z_1, z_2) &=& z_1 & (\mathrel{\mbox{otherwise}}) \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-fpmax}{\mathrm{fpmax}}_N(z_1, z_2)\)

  • 如果 \(z_1\) 小于 \(z_2\),则返回 \(z_2\)

  • 否则返回 \(z_1\)

\[\begin{split}\begin{array}{@{}lcll} \href{../exec/numerics.html#op-fpmax}{\mathrm{fpmax}}_N(z_1, z_2) &=& z_2 & (\mathrel{\mbox{if}} \href{../exec/numerics.html#op-flt}{\mathrm{flt}}_N(z_1, z_2) = 1) \\ \href{../exec/numerics.html#op-fpmax}{\mathrm{fpmax}}_N(z_1, z_2) &=& z_1 & (\mathrel{\mbox{otherwise}}) \end{array}\end{split}\]

转换

\(\href{../exec/numerics.html#op-extend-u}{\mathrm{extend}^{\mathsf{u}}}_{M,N}(i)\)

  • 返回 \(i\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-extend-u}{\mathrm{extend}^{\mathsf{u}}}_{M,N}(i) &=& i \\ \end{array}\end{split}\]

注意

在抽象语法中,无符号扩展只是重新解释相同的值。

\(\href{../exec/numerics.html#op-extend-s}{\mathrm{extend}^{\mathsf{s}}}_{M,N}(i)\)

  • \(j\)带符号解释\(i\) 大小为 \(M\)

  • 返回 \(j\) 相对于大小 \(N\) 的二进制补码。

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-extend-s}{\mathrm{extend}^{\mathsf{s}}}_{M,N}(i) &=& \href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_N^{-1}(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_M(i)) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-wrap}{\mathrm{wrap}}_{M,N}(i)\)

  • 返回 \(i\)\(2^N\) 的结果。

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-wrap}{\mathrm{wrap}}_{M,N}(i) &=& i \mathbin{\mathrm{mod}} 2^N \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-trunc-u}{\mathrm{trunc}^{\mathsf{u}}}_{M,N}(z)\)

  • 如果 \(z\) 是 NaN,则结果未定义。

  • 如果 \(z\) 是无穷大,则结果未定义。

  • 如果 \(z\) 是一个数字,并且 \(\href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(z)\) 是目标类型范围内的值,则返回该值。

  • 否则结果未定义。

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-trunc-u}{\mathrm{trunc}^{\mathsf{u}}}_{M,N}(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \{\} \\ \href{../exec/numerics.html#op-trunc-u}{\mathrm{trunc}^{\mathsf{u}}}_{M,N}(\pm \infty) &=& \{\} \\ \href{../exec/numerics.html#op-trunc-u}{\mathrm{trunc}^{\mathsf{u}}}_{M,N}(\pm q) &=& \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(\pm q) & (\mathrel{\mbox{if}} -1 < \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(\pm q) < 2^N) \\ \href{../exec/numerics.html#op-trunc-u}{\mathrm{trunc}^{\mathsf{u}}}_{M,N}(\pm q) &=& \{\} & (\mathrel{\mbox{otherwise}}) \\ \end{array}\end{split}\]

注意

此运算符是 部分的。它没有为 NaN、无穷大或结果超出范围的值定义。

\(\href{../exec/numerics.html#op-trunc-s}{\mathrm{trunc}^{\mathsf{s}}}_{M,N}(z)\)

  • 如果 \(z\) 是 NaN,则结果未定义。

  • 如果 \(z\) 是无穷大,则结果未定义。

  • 如果 \(z\) 是一个数字,并且 \(\href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(z)\) 是目标类型范围内的值,则返回该值。

  • 否则结果未定义。

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-trunc-s}{\mathrm{trunc}^{\mathsf{s}}}_{M,N}(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \{\} \\ \href{../exec/numerics.html#op-trunc-s}{\mathrm{trunc}^{\mathsf{s}}}_{M,N}(\pm \infty) &=& \{\} \\ \href{../exec/numerics.html#op-trunc-s}{\mathrm{trunc}^{\mathsf{s}}}_{M,N}(\pm q) &=& \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(\pm q) & (\mathrel{\mbox{if}} -2^{N-1} - 1 < \href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(\pm q) < 2^{N-1}) \\ \href{../exec/numerics.html#op-trunc-s}{\mathrm{trunc}^{\mathsf{s}}}_{M,N}(\pm q) &=& \{\} & (\mathrel{\mbox{otherwise}}) \\ \end{array}\end{split}\]

注意

此运算符是 部分的。它没有为 NaN、无穷大或结果超出范围的值定义。

\(\href{../exec/numerics.html#op-trunc-sat-u}{\mathrm{trunc\_sat\_u}}_{M,N}(z)\)

  • 如果 \(z\) 是 NaN,则返回 \(0\)

  • 如果 \(z\) 是负无穷大,则返回 \(0\)

  • 如果 \(z\) 是正无穷大,则返回 \(2^N - 1\)

  • 否则,返回 \(\href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(\href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(z))\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-trunc-sat-u}{\mathrm{trunc\_sat\_u}}_{M,N}(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& 0 \\ \href{../exec/numerics.html#op-trunc-sat-u}{\mathrm{trunc\_sat\_u}}_{M,N}(- \infty) &=& 0 \\ \href{../exec/numerics.html#op-trunc-sat-u}{\mathrm{trunc\_sat\_u}}_{M,N}(+ \infty) &=& 2^N - 1 \\ \href{../exec/numerics.html#op-trunc-sat-u}{\mathrm{trunc\_sat\_u}}_{M,N}(z) &=& \href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(\href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(z)) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-trunc-sat-s}{\mathrm{trunc\_sat\_s}}_{M,N}(z)\)

  • 如果 \(z\) 是 NaN,则返回 \(0\)

  • 如果 \(z\) 是负无穷大,则返回 \(-2^{N-1}\)

  • 如果 \(z\) 是正无穷大,则返回 \(2^{N-1} - 1\)

  • 否则,返回 \(\href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(\href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(z))\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-trunc-sat-s}{\mathrm{trunc\_sat\_s}}_{M,N}(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& 0 \\ \href{../exec/numerics.html#op-trunc-sat-s}{\mathrm{trunc\_sat\_s}}_{M,N}(- \infty) &=& -2^{N-1} \\ \href{../exec/numerics.html#op-trunc-sat-s}{\mathrm{trunc\_sat\_s}}_{M,N}(+ \infty) &=& 2^{N-1}-1 \\ \href{../exec/numerics.html#op-trunc-sat-s}{\mathrm{trunc\_sat\_s}}_{M,N}(z) &=& \href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(\href{../exec/numerics.html#aux-trunc}{\mathrm{trunc}}(z)) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-promote}{\mathrm{promote}}_{M,N}(z)\)

  • 如果 \(z\) 是一个 规范 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\}\) 的一个元素(即,大小为 \(N\) 的规范 NaN)。

  • 如果 \(z\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(1)\}\) 的一个元素(即,大小为 \(N\) 的任何 算术 NaN)。

  • 否则,返回 \(z\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-promote}{\mathrm{promote}}_{M,N}(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} & (\mathrel{\mbox{if}} n = \href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N) \\ \href{../exec/numerics.html#op-promote}{\mathrm{promote}}_{M,N}(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{+ \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(1)\} & (\mathrel{\mbox{otherwise}}) \\ \href{../exec/numerics.html#op-promote}{\mathrm{promote}}_{M,N}(z) &=& z \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-demote}{\mathrm{demote}}_{M,N}(z)\)

  • 如果 \(z\) 是一个 规范 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\}\) 的一个元素(即,大小为 \(N\) 的规范 NaN)。

  • 如果 \(z\) 是 NaN,则返回 \(\href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(1)\}\) 的一个元素(即,大小为 \(N\) 的任何 NaN)。

  • 如果 \(z\) 是无穷大,则返回该无穷大。

  • 如果 \(z\) 是零,则返回该零。

  • 否则,返回 \(\href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(z)\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-demote}{\mathrm{demote}}_{M,N}(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{\} & (\mathrel{\mbox{if}} n = \href{../syntax/values.html#aux-canon}{\mathrm{canon}}_N) \\ \href{../exec/numerics.html#op-demote}{\mathrm{demote}}_{M,N}(\pm \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(n)) &=& \href{../exec/numerics.html#aux-nans}{\mathrm{nans}}_N\{+ \href{../syntax/values.html#syntax-float}{\mathsf{nan}}(1)\} & (\mathrel{\mbox{otherwise}}) \\ \href{../exec/numerics.html#op-demote}{\mathrm{demote}}_{M,N}(\pm \infty) &=& \pm \infty \\ \href{../exec/numerics.html#op-demote}{\mathrm{demote}}_{M,N}(\pm 0) &=& \pm 0 \\ \href{../exec/numerics.html#op-demote}{\mathrm{demote}}_{M,N}(\pm q) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(\pm q) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-convert-u}{\mathrm{convert}^{\mathsf{u}}}_{M,N}(i)\)

  • 返回 \(\href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(i)\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-convert-u}{\mathrm{convert}^{\mathsf{u}}}_{M,N}(i) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(i) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-convert-s}{\mathrm{convert}^{\mathsf{s}}}_{M,N}(i)\)

  • \(j\)\(i\)有符号解释

  • 返回 \(\href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(j)\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-convert-s}{\mathrm{convert}^{\mathsf{s}}}_{M,N}(i) &=& \href{../exec/numerics.html#aux-ieee}{\mathrm{float}}_N(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_M(i)) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-reinterpret}{\mathrm{reinterpret}}_{t_1,t_2}(c)\)

  • \(d^\ast\) 为位序列 \(\href{../exec/numerics.html#aux-bits}{\mathrm{bits}}_{t_1}(c)\)

  • 返回常量 \(c'\),其中 \(\href{../exec/numerics.html#aux-bits}{\mathrm{bits}}_{t_2}(c') = d^\ast\)

\[\begin{split}\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-reinterpret}{\mathrm{reinterpret}}_{t_1,t_2}(c) &=& \href{../exec/numerics.html#aux-bits}{\mathrm{bits}}_{t_2}^{-1}(\href{../exec/numerics.html#aux-bits}{\mathrm{bits}}_{t_1}(c)) \\ \end{array}\end{split}\]

\(\href{../exec/numerics.html#op-narrow-s}{\mathrm{narrow}^{\mathsf{s}}}_{M,N}(i)\)

  • \(j\)带符号解释\(i\) 大小为 \(M\)

  • 返回 \(\href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(j)\)

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-narrow-s}{\mathrm{narrow}^{\mathsf{s}}}_{M,N}(i) &=& \href{../exec/numerics.html#aux-sat-s}{\mathrm{sat\_s}}_N(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_M(i)) \end{array}\]

\(\href{../exec/numerics.html#op-narrow-u}{\mathrm{narrow}^{\mathsf{u}}}_{M,N}(i)\)

  • \(j\)带符号解释\(i\) 大小为 \(M\)

  • 返回 \(\href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(j)\)

\[\begin{array}{lll@{\qquad}l} \href{../exec/numerics.html#op-narrow-u}{\mathrm{narrow}^{\mathsf{u}}}_{M,N}(i) &=& \href{../exec/numerics.html#aux-sat-u}{\mathrm{sat\_u}}_N(\href{../exec/numerics.html#aux-signed}{\mathrm{signed}}_M(i)) \end{array}\]