Как переписать на php такой js код?

Подскажите пожалуйста как переписать такой код на php. В последних трёх строчках функции не понимаю что происходит - первый раз такую запись вижу
erf (c, d) {
    e = d.length - 1,
    f = !1,
    g = 0,
    h = 0,
    i,
    j,
    k,
    l;
     c < 0 && ((c = -c), (f = !0)), (i = 2 / (2 + c)), (j = 4 * i - 2);
     for (; e > 0; e--) (k = g), (g = j * g - h + d[e]), (h = k);
     return (l = i * Math.exp(-c * c + 0.5 * (d[0] + j * g) - h)), f ? l - 1 : 1 - l;
}
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$e = count($d) - 1;
$f = false;
$g = 0;
$h = 0;
if ($c < 0) {
    $c = -$c;
    $f = true;
}
$i = 2 / (2 + $c);
$j = 4 * $i - 2;
for (; $e > 0; $e--) {
    $k = $g;
    $g = $j * $g - $h + $d[$e];
    $h = $k;
}
$l = $i * exp(-$c * $c + 0.5 * ($d[0] + $j * $g) - $h);
return $f ? ($l - 1) : (1 - $l);

Но результат может оказаться разным из-за разной точности вычисления exp.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vesper-bot
@vesper-bot
Любитель файрволлов
Вообще, тут обычная математика. Просто запятая, как сказал Вадим, используется вместо записи полноценного блока операторов в цикле for() и в операторе возврата. Т.е. первая строка читается примерно так:
if (c<0) { c=-c; f=0;}
i=2/2+c;
j=4*i-2;
Здесь выполняется нормировка значения 2/2+abs(c) в рамки (-2,2) из исходных (0,1). Вторая строка итерирует массив d с конца, заполняя g и h промежуточными вычислениями, начиная с 0, переменная k всего лишь нужна хранить старое значение g. В третьей строке выполняется расчет для 0-го элемента цикла (формула та же, можно было закончить цикл и потом в формулу подставить полученный g), и возвращается значение sgn(c)*(1-l) где l вычисляется сразу перед return. Вот только что эта функция такого считает - несколько непонятно, может, корреляцию для некоего распределения известной формы и полученными из него значениями в d с предполагаемой величиной параметра c.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы