Dyalog APL连续减法与缩减减运算结果异常问题咨询
为什么Dyalog APL中连续减法和分步减法结果不同?
这是因为APL的运算逻辑和常规数学的连续减法规则存在核心差异,关键在运算符结合性和缩减运算符的折叠方式:
1. APL的减法是右结合,而非左结合
常规数学里,a - b - c默认按左结合计算:(a - b) - c,但APL的二元运算符默认是右结合,所以连续减法会被解析成嵌套的右括号结构:a - (b - c)。
用你的例子验证:
692.4 - 88 - 6.45 - 39.08 - 20 - 53
实际运算顺序为:
692.4 - (88 - (6.45 - (39.08 - (20 - 53)))) = 692.4 - (88 - (6.45 - (39.08 - (-33)))) = 692.4 - (88 - (6.45 - 72.08)) = 692.4 - (88 - (-65.63)) = 692.4 - 153.63 = 538.77
这就是你得到“错误结果”的根本原因。
2. 缩减减-/的运算逻辑
-/是APL的缩减运算符,它会把减法以右结合的方式依次应用到数组元素上,等价于从右往左嵌套减法:
对于数组692.4 88 6.45 39.08 20 53,-/的计算逻辑和上面的连续减法完全一致,所以结果也是538.77。
3. 实现左结合连续减法的方法
如果要得到和分步运算一致的485.87,有两种简单方式:
- 显式加括号强制左结合:
((((692.4 - 88) - 6.45) - 39.08) - 20) - 53
- 用加法缩减替代减法:把所有减数转成负数,再用
+/求和(加法是左结合,和常规逻辑一致):
+/ 692.4, -88 -6.45 -39.08 -20 -53
内容的提问来源于stack exchange,提问作者конструктор
相关产品推荐
相关产品推荐

