Неожиданный результат для внутреннего продукта с использованием снижения - PullRequest
3 голосов
/ 03 февраля 2020

В этом коде я вычисляю угол между двумя векторами (xvec и yvec) по обычному отношению inner-product :

enter image description here

var ang = 30.0 * (pi / 180.0);

var xvec = [3.0, 0.0],
    yvec = [cos(ang), sin(ang)] * 10.0;

var norm1sq = (+ reduce xvec**2),
    norm2sq = (+ reduce yvec**2),
    prod    = (+ reduce xvec * yvec);

var ang_out = acos(prod / sqrt(norm1sq * norm2sq));

writeln("ang_out (in degrees) = ", ang_out * (180.0 / pi));

Мой ожидаемый результат - ang_out = 30 градусов, но на самом деле я получаю этот вывод (с chapel-1.20.0):

ang_out (in degrees) = 30.0 60.0

Итак, я мне интересно откуда взялись эти "60 градусов" ...?

1 Ответ

3 голосов
/ 03 февраля 2020

+ reduce в строке ниже имеет приоритет над *, поэтому мы в итоге делаем уменьшение на xvec с последующим повышением умножения на yvec, что делает prod кортежем чисел:

// same as: (+ reduce xvec) * yvec;
prod    = (+ reduce xvec * yvec); 

Для исправления используйте скобки:

prod    = (+ reduce (xvec * yvec));

В качестве альтернативы используйте модуль LinearAlgebra для точечного произведения:

use LinearAlgebra;

...

prod    = xvec.dot(yvec);

См. Таблицу приоритетов ( порядок операций) в spe c: приоритет и ассоциативность

Если вы заинтересованы в участии в беседе, существует проблема с изменением порядка приоритета именно для этой ситуации : часовня-ланг / часовня # 11463

...