Назначение функции C, генерируемой matlab, неизвестно - PullRequest
1 голос
/ 20 апреля 2020

Может кто-нибудь помочь мне понять, что делает эта функция? Я предполагаю, что это делает какое-то возведение в степень. Я искал в Google имя, которое, кажется, происходит от какого-то C кода, сгенерированного Matlab. Кто-нибудь знает точно, что эта функция должна делать? Что может означать ОЯТ? Спасибо.

double rt_powd_snf(double u0, double u1)
{
  double y;
  double d0;
  double d1;
  if (isnan(u0) || isnan(u1))
  {
    y = NAN;
  }
  else
  {
    d0 = fabs(u0);
    d1 = fabs(u1);
    if (isinf(u1))
    {
      if (d0 == 1.0)
      {
        y = 1.0;
      }
      else if (d0 > 1.0)
      {
        if (u1 > 0.0)
        {
          y = INFINITY;
        }
        else
        {
          y = 0.0;
        }
      }
      else if (u1 > 0.0)
      {
        y = 0.0;
      }
      else
      {
        y = INFINITY;
      }
    }
    else if (d1 == 0.0)
    {
      y = 1.0;
    }
    else if (d1 == 1.0)
    {
      if (u1 > 0.0)
      {
        y = u0;
      }
      else
      {
        y = 1.0 / u0;
      }
    }
    else if (u1 == 2.0)
    {
      y = u0 * u0;
    }
    else if ((u1 == 0.5) && (u0 >= 0.0))
    {
      y = sqrt(u0);
    }
    else if ((u0 < 0.0) && (u1 > floor(u1)))
    {
      y = NAN;
    }
    else
    {
      y = pow(u0, u1);
    }
  }

  return y;
}

1 Ответ

2 голосов
/ 20 апреля 2020

Эта функция повышает один double до степени другого double.

. Это можно увидеть по вызову pow внизу:

y = pow(u0, u1);

Это также обрабатывать различные особые случаи, аккуратно обрабатывать нечисловые и бесконечные входные данные и эффективно обрабатывать специальные значения.

powd означает, что это степенная функция, использующая двойные числа. Из документации _snf означает, что он может обрабатывать не конечные числа. Префикс rt_ происходит из переменной конфигурации Модификатор имени переменной MAT-файла . Я предполагаю, что это означает «время выполнения», но это не основано.

В коде d0 и d1 являются абсолютными (отрицательные становятся положительными) версии входных данных u0 и u1. Результат в y.


Проходя по коду:

  • Если основание или показатель степени равны NAN
    • Возврат NAN
  • Если показатель степени бесконечен
    • Если абсолютное основание равно 1,0
      • Возвращено 1,0
    • Если абсолютное значение основание больше 1,0
      • Если показатель положителен (бесконечность)
        • Возврат INFINITY
      • Иначе показатель отрицателен (бесконечность)
        • Возврат 0,0
    • В противном случае абсолютное основание меньше 1,0
      • Если показатель степени положителен (бесконечность)
        • Возврат 0,0
      • Иначе показатель отрицателен (бесконечность)
        • Возврат INFINITY
  • Если абсолютный показатель равен 0,0
    • Возвращается 1,0
  • Если абсолютный показатель равен 1,0
    • Если показатель положительный (1,0 )
      • Вернуть базу * 10 87 *
    • Иначе показатель отрицателен (1,0)
      • Возврат 1,0 / основание
  • Если показатель степени равно 2,0
    • Возвращает само базовое время
  • Если показатель равен 0,5, а основание неотрицательно
    • Возвращает квадрат root из основание
  • Если основание отрицательно, а показатель степени не является целым числом
    • Возврат NAN
  • В противном случае случай не особенный
    • Возвращает результат pow(u0, u1)
...