第二十一章 ObjectScript 应用程序中的数值计算 - 算术运算
算术运算
同质表示
仅涉及十进制值的表达式将始终产生十进制结果。同样,仅具有 $DOUBLE 值的表达式将始终生成 $DOUBLE 结果。此外,
- 如果涉及十进制值的计算结果溢出,将导致
<MAXNUMBER>错误。在这种情况下,不会像文字那样自动转换为$DOUBLE。 - 如果十进制表达式下溢,则生成
0作为表达式的结果。 - 默认情况下,溢出、除零和无效操作的 IEEE 错误将分别发出
<MAXNUMBER>,<DIVIDE>, and<ILLEGAL VALUE>错误信号,而不是生成Infinity或NaN结果。可以通过单个进程的%SYSTEM.Process类的IEEEError()方法或整个系统的Config.Miscellaneous 类的IEEEError()方法来修改此行为。 - 表达式
0 ** 0(十进制)生成十进制值0;但是,表达式$DOUBLE(0) ** $DOUBLE(0)生成$DOUBLE值1。在IRIS中,前者始终为真;后者是IEEE标准所要求的。
异构表示
涉及十进制和 $DOUBLE 表示形式的表达式始终生成 $DOUBLE 值。使用时会发生值的转换。因此,在表达式中
1 + 2 * $DOUBLE(4.0)
IRIS 首先将 1 和 2 作为十进制值相加。然后它将结果 3 转换为 $DOUBLE 格式并进行乘法运算。结果是 $DOUBLE(12)。
clipboardRounding
必要时,数值结果将四舍五入到最接近的可表示值。当要舍入的值同样接近两个可用值时,则:
$DOUBLE值按照IEEE标准中的定义四舍五入为偶数- 小数值从零开始四舍五入,即朝更大的值(绝对值)舍入
比较运算
同质表示
$DOUBLE(+0) 和 $DOUBLE(-0) 之间的比较将这些值视为相等。这遵循 IEEE 标准。这与 IRIS 十进制中的相同,因为当 $DOUBLE(+0) 或 $DOUBLE(-0) 转换为字符串时,两种情况的结果都是“0”。
$DOUBLE(nan) 与任何其他数值(包括 $DOUBLE(nan))之间的比较将表明这些值不大于、不等于且不小于。这遵循 IEEE 标准。这与通常的 ObjectScript 规则不同,后者表示相等性比较是通过转换为字符串并检查字符串是否相等来完成的。
注意:表达式 nan 等于 $DOUBLE(nan),因为比较是作为字符串比较完成的。
注意:但是,$LISTSAME 认为包含 $DOUBLE(nan) 的列表组件与包含 $DOUBLE(nan) 的列表组件相同。这是 $LISTSAME 唯一将不相等的值视为相等的地方。
异构表示
小数值和 $DOUBLE 值之间的比较是完全准确的。比较是在不对任一值进行任何舍入的情况下完成的。如果仅涉及有限值,那么这些比较将得到与将两个值转换为字符串并使用默认排序规则比较这些字符串时得到的结果相同的答案。
涉及运算符 <, <=, >, and => 的比较始终会生成十进制值形式的布尔结果 0 或 1。如果操作数之一是字符串,则在执行比较之前该操作数会转换为十进制值。其他数字操作数不被转换。如前所述,混合数字类型的比较是完全准确的并且没有转换。
对于字符串比较运算符(=, '=, ], '], [, '[, ]], ']] 等),在进行比较之前,任何数字操作数都会首先转换为字符串。
小于或等于、大于或等于
在 IRIS 中,运算符 <= 和 >= 分别被视为运算符 '>和 '< 的同义词。
注意:如果在比较中使用运算符 <= 或 >=,其中一个或两个操作数可能为 NaN,则结果将与 IEEE 标准规定的结果不同。
当 A 和/或 B 为 NaN 时,表达式 A >= B 解释如下:
- 表达式转换为
A '> B。 - 进一步变换为
'(A >B)。 - 如前所述,涉及
NaN的比较给出的结果是 (a) 不等于、(b) 不大于、(c) 不小于,因此括号中的表达式会产生false值。 - 该值的否定结果为
true值。
注意:如果表达式 A >= B 表示为 ((A > B) | (A = B)),则可以重写该表达式以提供 IEEE 预期结果。
布尔运算
对于布尔运算(and、or not、nor、nand 等),任何字符串操作数都会转换为十进制。任何数字操作数(十进制或 $DOUBLE)均保持不变。
数值为零被视为 FALSE;所有其他数值(包括$DOUBLE(nan) 和 $DOUBLE(inf))均被视为 TRUE。结果是 0 或 1(十进制)。
注意:$DOUBLE(-0) 也是 false。