в дополнение к принятию другого ответа.

равнить длинные пары сqsort() и в отношениине-число?

При сортировке массива, который может содержать не-числа, я хотел бы поместить все теNAN на один конец отсортированного массива.

qsort() накладывает некоторые ограничения на функцию сравнения.

Функция должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.
C11dr §7.22.5.2 3

Когда одни и те же объекты ... передаются в функцию сравнения более одного раза, результаты должны соответствовать друг другу. То есть дляqsort они должны определитьобщий заказ в массиве ... один и тот же объект всегда должен сравниваться одинаково с ключом.
§7.22.5 4

a > b&nbsp;ложь, когдаa <= b&nbsp;или еслиa&nbsp;не номер или еслиb&nbsp;это не число. Такa > b&nbsp;это не то же самое, что!(a <= b)&nbsp;поскольку они имеют противоположные результаты, если один из них является NaN.

Если функция сравнения используетreturn (a > b) - (a < b);, код будет возвращать 0, если один или обаa&nbsp;или жеb&nbsp;являются NaN. Массив не будет отсортирован по желанию, и он теряетобщий заказ&nbsp;требование.

long double&nbsp;аспект такого рода важен при использовании функций классификации, таких какint isnan(real-floating x);&nbsp;или жеint isfinite(real-floating x);, я знаюisfinite( finite_long_double_more_than_DBL_MAX)&nbsp;может вернуть ложь. Так что у меня есть опасения по поводу того, чтоisnan(some_long_double)&nbsp;может сделатьчто-то&nbsp;неожиданный.

Я попробовал ниже. Видимо, сортирует по желанию.

Суб-вопрос:&nbsp;Являетсяcompare()&nbsp;ниже достаточно для сортировки по желанию? Любые рекомендуемые упрощения? Если нет - как исправить? (Для этой задачи все значения, например, 0.0L и -0.0L, можно сортировать любым способом)

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <float.h>

int compare(const void *a, const void *b) {
  const long double *fa = (const long double *) a;
  const long double *fb = (const long double *) b;
  if (*fa > *fb) return 1;
  if (*fa < *fb) return -1;

  if (*fa == *fb) {
    //return -memcmp(fa, fb, sizeof *fa); if -0.0, 0.0 order important.
    return 0;
  }
  // At least one of *fa or *fb is NaN
  // is *fa a non-NaN?
  if (!isnan(*fa)) return -1;
  if (!isnan(*fb)) return 1;

  // both NaN
  return 0;
  // return -memcmp(fa, fb, tbd size); if NaN order important.
}

int main(void) {
  long double x[] = { 0.0L / 0.0, 0.0L / 0.0, 0.0, 1.0L / 0.0, -0.0, LDBL_MIN,
      LDBL_MAX, 42.0, -1.0L / 0.0, 867-5309, -0.0 };
  x[0] = -x[0];
  printf("unsorted: ");
  size_t n = sizeof x / sizeof x[0];
  for (size_t i = 0; i < n; i++) {
    printf("%.3Le,", x[i]);
  }
  printf("\nsorted: ");
  qsort(x, n, sizeof x[0], compare);
  for (size_t i = 0; i < n; i++) {
    printf("%.3Le,", x[i]);
  }
  puts("");
}

Выход

unsorted: nan,-nan,0.000e+00,inf,-0.000e+00,3.362e-4932,1.190e+4932,4.200e+01,-inf,-4.442e+03,-0.000e+00,
sorted: -inf,-4.442e+03,-0.000e+00,0.000e+00,-0.000e+00,3.362e-4932,4.200e+01,1.190e+4932,inf,nan,-nan,

Если бы я знал, что функция сравнения была правильной, я бы опубликовал в Code Review идеи для улучшения. Тем не менее, я не уверен, что код правильно работает с этими надоедливыми NaN.