定点数据和中间结果
编译器确定中间结果中的整数和小数位数。
加法,减法,乘法和除法
下表显示了作为加法,减法,乘法或除法的结果在理论上可能的精度。
| 操作 | 整数位 | 小数位数 |
|---|---|---|
| + 或- | (i1 或 i2) + 1 ,以较大者为准 | d1 或 d2,以较大者为准 |
| * | i1 + i2 | d1 + d2 |
| / | i2 + d1 | (d2 - d1) 或 dmax(以较大者为准) |
必须定义具有足够小数位的任何算术语句的操作数,以获取最终结果中所需的准确性。
下表显示了对于在 兼容性方式 (即,当缺省编译器选项 ARITH(COMPAT) 生效时) 中涉及加法,减法,乘法或除法的算术运算的定点中间结果,编译器将执行的位置数:
| i + d 的值 | d 的值 | i + dmax 的值 | 为 ir 携带的位置数 |
|---|---|---|---|
| <30 或 =30 | 任何值 | 任何值 | i 整数和 d 小数位 |
| >30 | <德马克斯 or =德马克斯 | 任何值 | 30-d 整数和 d 小数位 |
| >dmax | <30 或 =30 | i 整数和 30-i 小数位 | |
| >30 | 30-dmax 整数和 dmax 小数位 |
下表显示了对于在 扩展方式 (即,当编译器选项 ARITH(EXTEND) 生效时) 中涉及加法,减法,乘法或除法的算术运算的定点中间结果,编译器所执行的位置数:
| i + d 的值 | d 的值 | i + dmax 的值 | 为 ir 携带的位置数 |
|---|---|---|---|
| <31 或 =31 | 任何值 | 任何值 | i 整数和 d 小数位 |
| >31 | <德马克斯 or =德马克斯 | 任何值 | 31-d 整数和 d 小数位 |
| >dmax | <31 或 =31 | i 整数和 31-i 小数位 | |
| >31 | 31-dmax 个整数和 dmax 个小数位 |
安装了 APAR PH58656 的 PTF 后, 完整方式 (即,当编译器选项 ARITH(FULL) 生效时) 也可用。 完全方式 与 扩展方式 相同,但有一个差异: 在 完全方式 中,除法运算的中间结果可能包含更大数量的十进制数字。 Specifically, ARITH(FULL) goes one step further than ARITH(EXTEND) in that after the normal rules have been followed for determining how many integer (我) and decimal (d) digits to retain in the intermediate result, if 我 + d < 31, d = 31 - 我. 换言之, ARITH(FULL) 将使用 ARITH(EXTEND) 保留的小数位数增加到 31 位数限制内的最大值,而不减少 i将正常保留的整数位数。 这种提高的精度可以最终改变正在求值的算术表达式的最终结果。
乘方
指数由表达式 op1 ** op2表示。 根据 op2的特征,编译器通过以下三种方法之一来处理定点数字的指数:
- 当 op2 用小数表示时,将使用浮点指令。
- 当 op2 是整数字面值或常量时,值 d 计算为
d = d1 * |op2|并且根据 op1的特征计算值 i :
- 当 op1 是数据名或变量时,
i = i1 * |op2| - 当 op1 是字面值或常量时, i 设置为等于 op1 ** |op2 |值中的整数数。
在兼容性方式 (使用
ARITH(COMPAT)进行编译) 中,已计算 i 和 d 的编译器将执行下表中指示的操作,以处理取幂的中间结果 ir 。i + d 的值 其他条件 执行的操作 <30 任何 对于 ir,将带有 i 整数和 d 小数位。 =30 op1 具有奇数个数字。 对于 ir,将带有 i 整数和 d 小数位。 op1 具有偶数位数。 与 op2 是整数数据名称或变量时的操作相同 (如下所示)。 异常: 对于以文字 1 为幂的 30 位整数,将为 ir携带 i 整数和 d 小数位。 >30 任何 与 op2 是整数数据名称或变量时的操作相同 (如下所示) 在扩展方式 (使用
ARITH(EXTEND)编译) 或完全方式 (使用ARITH(FULL)编译)中,已计算 i 和 d 的编译器将执行下表中指示的操作来处理指数的中间结果 ir 。i + d 的值 其他条件 执行的操作 <31 任何 对于 ir,将带有 i 整数和 d 小数位。 = 31 或> 31 任何 与 op2 是整数数据名称或变量时的操作相同 (如下所示)。 异常: 对于以文字 1 为幂的 31 位整数,将为 ir携带 i 整数和 d 个小数位。 如果 op2 为负数,那么 1 的值将除以初步计算所生成的结果。 使用的 i 和 d 的值是按照上面已显示的定点数据的分割规则计算的。
- 当 op1 是数据名或变量时,
- 当 op2 是整数数据名称或变量时,将使用 dmax 小数位和 30-dmax (兼容性方式) 或 31-dmax (扩展方式 或完全方式) 整数位。 对于非零 op2, op1 乘以自身 (|op2|-1) 次。
如果 op2 等于 0 ,那么结果为 1。 Division-by-0 和指数
SIZE ERROR条件适用。
具有 9 个以上有效数字的定点指数总是被截断为 9 个数字。 如果指数是字面值或常量,那么将发出 E 级编译器诊断消息; 否则,将在运行时发出参考消息。