在<
,>
,<=
,和>=
运算符被称为关系运算符。
关系表达式:
附加表达式
附加表达式 <
关系表达式
附加表达式 >
关系表达式
附加表达式 <=
_关系表达式
附加表达式 >=
关系表达式
这些运算符用于确定两个值之间的相对排序关系,如下表所示:
手术 | 结果 |
---|---|
x < y | true如果x小于y,false否则 |
x > y | true如果x大于y,false否则 |
x <= y | true如果x小于或等于y,false否则 |
x >= y | true如果x大于或等于y,false否则 |
例如:
复制
代码语言:javascript复制0 <= 1 // true
null < 1 // null
null <= null // null
"ab" < "abc" // true
#nan >= #nan // false
#nan <= #nan // false
在计算包含关系运算符的表达式时,以下内容成立:
- 传播计算
x
或y
操作数表达式时引发的错误。 - 通过对
x
和y
表达式求值而产生的值必须是数字、日期、日期时间、日期时区、持续时间、逻辑值、空值或时间值。否则,"Expression.Error"
会引发带有原因代码的错误。 - 如果一个或两个操作数都是
null
,则结果是null
值。 - 如果两个操作数都是逻辑的,
true
则认为该值大于false
。 - 如果两个操作数都是持续时间,则根据它们代表的 100 纳秒滴答的总数比较这些值。
- 通过比较它们的小时部分,如果相等,则比较它们的分钟部分,如果相等,则比较它们的第二部分,从而比较两个时间。
- 两个日期的比较是通过比较它们的年份部分,如果相等,则比较它们的月份部分,如果相等,则比较它们的日期部分。
- 两个日期时间的比较是通过比较它们的年份部分,如果相等,它们的月份部分,如果相等,它们的日部分,如果相等,它们的小时部分,如果相等,它们的分钟部分,如果相等,它们的第二部分。
- 通过减去它们的小时/分钟偏移量然后比较它们的日期时间组件,将它们标准化为 UTC 来比较两个日期时区。
- 两个数字
x
并y
根据 IEEE 754 标准的规则进行比较:- 如果任一操作数为
#nan
,则结果适用false
于所有关系运算符。 - 当两个操作数都不是 时
#nan
,运算符根据排序比较两个浮点操作数的值,-∞ < -max < ... < -min < -0.0 = 0.0 < min < ... < max < ∞
其中 min 和 max 是可以表示的最小和最大正有限值。-∞ 和 ∞ 的 M 名称是-#infinity
和#infinity
。 这种排序的显着影响是:- 负零和正零被认为是相等的。
- 一个
-#infinity
值被认为小于所有其他数字值,但等于另一个-#infinity
。 - 一个
#infinity
值被认为大于所有其他数字值,但等于另一个#infinity
。
- 如果任一操作数为
条件逻辑运算符
在and
与or
运营商被称为条件逻辑运算符。
逻辑或表达式:
逻辑与表达式
逻辑与表达式 or
逻辑或表达式
逻辑与表达式:
是表达式
是表达式 and
逻辑与表达式
该or
操作符返回true
其操作数的当至少一个true
。当且仅当左操作数不是 时,才计算右操作数true
。
该and
操作符返回false
其操作数的当至少一个false
。当且仅当左操作数不是 时,才计算右操作数false
。
or
和and
运算符的真值表如下所示,纵轴为左操作数表达式的计算结果,横轴为右操作数表达式的计算结果。
and | true | false | null | error |
---|---|---|---|---|
true | true | false | null | error |
false | false | false | false | false |
null | null | false | null | error |
error | error | error | error | error |
or | true | false | null | error |
---|---|---|---|---|
or | true | false | null | error |
true | true | true | true | true |
false | true | false | null | error |
null | true | null | null | error |
error | error | error | error | error |
在评估包含条件逻辑运算符的表达式时,以下内容成立:
- 传播计算
x
ory
表达式时引发的错误。 - 条件逻辑运算符是在类型
logical
和上定义的null
。如果操作数值不是这些类型,"Expression.Error"
则会引发带有原因代码的错误。 - 结果是一个逻辑值。
- 在表达式
x
or 中y
,y
当且仅当x
不计算为 时才会计算表达式true
。 - 在表达式
x
and 中y
,y
当且仅当x
不计算为 时才会计算表达式false
。
最后两个属性赋予条件逻辑运算符“条件”限定;特性也称为“短路”。这些属性对于编写紧凑的受保护谓词很有用。例如,以下表达式是等效的:
复制
代码语言:javascript复制d <> 0 and n/d > 1 if d <> 0 then n/d > 1 else false
算术运算符
的
,-
,*
和/
运营商的算术运算符。
加法表达式:
乘法表达式
加法表达式
乘法表达式
加法表达式 -
乘法表达式
乘法表达式:
元数据表达式
乘法表达式 *
元数据表达式
乘法表达式 /
元数据表达式
精确
M 中的数字使用多种表示形式存储,以尽可能多地保留有关来自各种来源的数字的信息。数字仅根据应用于它们的运算符的需要从一种表示形式转换为另一种表示形式。M 支持两种精度:
精确 | 语义 |
---|---|
Precision.Decimal | 128 位十进制表示,范围为 ±1.0 x 10-28 至 ±7.9 x 1028 和 28-29 位有效数字。 |
Precision.Double | 使用尾数和指数的科学表示;符合 64 位二进制双精度 IEEE 754 算术标准IEEE 754-2008。 |
算术运算是通过选择精度,将两个操作数转换为该精度(如有必要),然后执行实际运算,最后返回所选精度的数字来执行的。
内置算术运算符 (
, -
, *
, /
) 使用双精度。标准库函数(Value.Add
、Value.Subtract
、Value.Multiply
、Value.Divide
)可用于使用特定精度模型来请求这些操作。
- 不可能出现数字溢出:
#infinity
或-#infinity
表示幅度太大而无法表示的值。 - 没有数字下溢是可能的:
0
并且-0
表示幅度太小而无法表示的值。 - IEEE 754 特殊值
#nan
(NaN—非数字)用于覆盖算术上无效的情况,例如零除以零。 - 从十进制到双精度的转换是通过将十进制数四舍五入到最接近的等效双精度值来执行的。
- 从双精度到小数精度的转换是通过将双精度数四舍五入到最接近的等效十进制值并在必要时溢出到
#infinity
或-#infinity
值来执行的。
加法运算符
加法运算符 ( x y
)的解释取决于计算表达式 x 和 y 的值类型,如下所示:
X | 是 | 结果 | 解释 |
---|---|---|---|
type number | type number | type number | 数字和 |
type number | null | null | |
null | type number | null | |
type duration | type duration | type duration | 数值和 |
type duration | null | null | |
null | type duration | null | |
type 约会时间 | type duration | type 约会时间 | 按持续时间偏移的日期时间 |
type duration | type 约会时间 | type 约会时间 | |
type 约会时间 | null | null | |
null | type 约会时间 | null | |
在该表中,type
日期时间代表任何的type date
,type datetime
,type datetimezone
,或type time
。添加持续时间和某种类型的datetime值时,结果值具有相同的类型。
对于表中所列值以外的其他值组合,将"Expression.Error"
引发带有原因代码的错误。以下各节介绍了每种组合。
传播评估任一操作数时引发的错误。
数字和
使用加法运算符计算两个数字的总和,产生一个数字。
例如:
复制
代码语言:javascript复制1 1 // 2
#nan #infinity // #nan
数字上的加法运算符使用双精度;标准库函数Value.Add
可用于指定小数精度。在计算数字总和时,以下内容成立:
- 双精度中的和是根据 64 位二进制双精度 IEEE 754 算术IEEE 754-2008的规则计算的。下表列出了非零有限值、零、无穷大和 NaN 的所有可能组合的结果。在表中,
x
和y
是非零有限值,z
是 的结果x y
。如果x
和y
大小相同但符号相反,z
则为正零。如果x y
太大而无法在目标类型中表示,z
则是与 具有相同符号的无穷大x y
。 表 7 是 0-0 ∞-∞NaNXzXX ∞-∞NaN 0是 0 0 ∞-∞NaN-0是 0-0 ∞-∞NaN ∞ ∞ ∞ ∞ ∞NaNNaN-∞-∞-∞-∞NaN-∞NaNNaNNaNNaNNaNNaNNaNNaN - Decimal Precision 中的总和是在不损失精度的情况下计算的。结果的标度是两个操作数的标度中较大的一个。
持续时间总和
两个持续时间之和就是代表持续时间所代表的100纳秒滴答数之和的持续时间。例如:
复制
代码语言:javascript复制#duration(2,1,0,15.1) #duration(0,1,30,45.3)
// #duration(2, 2, 31, 0.4)