关于Dyalog APL归约操作+/、×/违背求值规范的技术问询
Dyalog APL归约操作的求值顺序与SIMD优化问题
许多函数不具备结合性,即a f(b f c)(APL中常写为a f b f c)与(a f b)f c的结果未必相同,浮点数加法+亦是如此。APL约定从右到左求值,例如÷/2 1 2的结果为4而非1。但Dyalog解释器的SIMD优化违反了该约定,具体表现如下:
示例1:加法归约顺序错误
(a b c)←1E¯6 ¯1E13 1E13 a+b+c ⍝ 结果为 0.000001 +/a b c ⍝ 结果为0,但理论上应与上一行等价
此处+/的求和顺序不符合APL从右到左的求值约定。
示例2:大规模数据下的求和差异
x←?10000000⍴0 ⍝ 生成1000万个随机浮点数 (+/x)-({⍺+⍵}/x) ⍝ 理论上"+/x"和"{⍺+⍵}/x"结果应完全相同 ⍝ 但实际差值几乎必然非零
+/的求和顺序依然错误,且错误结果与{⍺+⍵}/⊖x一致,即从左端开始求和(与约定的从右到左方向相反)。
额外示例:浮点数精度差异
(a b c)←0.6 0.7 0.4 ⎕PP←17 ⍝ 确保能识别出数值差异 a+b+c ⍝ 结果为 1.7000000000000002 +/a b c ⍝ 结果为 1.6999999999999997,但理论上应与上一行等价
除加法归约外,乘积归约×/也受此问题影响,例如0.6×0.7×0.4与×/0.6 0.7 0.4的结果存在非零差异;而最小公倍数归约∧/未受影响。
正式问询
- 该底层SIMD优化为何无法按APL约定的正确顺序处理数值?
- 此问题是否已被官方报告或记录?
内容的提问来源于stack exchange,提问作者Jeppe Stig Nielsen
相关产品推荐
相关产品推荐

