Q:

Неправильные вычисления при попытке найти сторону по двум сторонам и углу в СИ

Столкнулась с такой проблемой: при вычислении третьей стороны треугольника показывает неправильный ответ.  Вот часть кода, где это не работает:
double prevodSUS(double a1, double a2, double a3) {
  double rad = 0, strana1 = 0, tmp = 0;

  if (a2 > 90) {
    tmp = 180 - a2;
    a2 = tmp;
  }

  rad = (a2 * M_PI) / 180;
  strana1 = sqrt(pow(a1, 2) + pow(a3, 2)- (2 * a1 * a3 * fabs(cos(rad))));
  return strana1;
}

int main() {
  double a1, a2, a3;

  a1 = 587;
  a2 = 93.084617194859987;
  a3 = 702;

  a2 = prevodSUS(a1, a2, a3);
  printf("a2 je %lf", a2);

  return 0;
}

Сторона должна быть 939, а выводит, что она  890.51951. 
Всем заранее большое спасибо за любой ответ или  предположение! 

A:

Вот это телодвижение 
if (a2 > 90) {
    tmp = 180 - a2;
    a2 = tmp;
}

лишнее, как и fabs тут:
strana1 = sqrt(pow(a1, 2) + pow(a3, 2)- (2 * a1 * a3 * fabs(cos(rad))));

Уберите, и все получится.
И еще - используйте нормальные имена (да и порядок передачи) переменных. Вот так, согласитесь, понятнее?
double prevodSUS(double edge1, double edge2, double angle )
{
    return sqrt(edge1*edge1 + edge2*edge2 - 2*edge1*edge2*cos(angle*M_PI/180));
}

Кстати, само имя функции - ну вот что должен подумать посторонний человек - что делает функция с именем prevodSUS?

