Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

97
Visualizações
Comparación de 3 vías de números de coma flotante

Dado un par de números de coma flotante, ¿cuál es la mejor manera de realizar una comparación triple, es decir, devolver negativo, cero o positivo, dependiendo de si el primer número es menor, igual o mayor que el segundo número?

Algunos lenguajes como Perl, Java y C++20 tienen este operador integrado o en la biblioteca estándar. Sin embargo, estoy preguntando cómo hacer esto en C simple.

Si las entradas fueran números enteros, sería una simple cuestión de escribir un par de comparaciones bidireccionales. Pero es más complicado con entradas de punto flotante debido al comportamiento especial de los NaN en comparación. ¿Cuál es la forma adecuada de hacerlo, teniendo eso en cuenta?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Devuelve -1, 0, 1 para menor, igual y mayor, más algún otro valor para no comparable:

 #include <math.h> int cmp(double a, double b) { if (isunordered(a, b)) { /* at least one NaN, return whatever you feel is appropriate */ return 42; } return (a>b) - (a<b); }

Si desea comparaciones borrosas con épsilon, siéntase libre de hacer que < y > sean un poco más complicados...

over 4 years ago · Santiago Trujillo Relatório

0

¿Cuál es la forma adecuada de hacerlo, teniendo en cuenta eso (NAN)?

Devuelva un tipo de FP para permitir 4 valores de retorno diferentes: -1.0, 0.0, 1.0, NAN.

Debajo también devuelve -0.0 en casos seleccionados que involucran -0.0.

 #include <math.h> double fcmp(double a, double b) { if (isunordered(a, b)) return NAN; if (a > b) return 1.0; if (a < b) return -1.0; return a - b; }

Incluso consideraría propagar a o b cuando uno es NAN para mantener la carga útil de NAN. Pueden existir muchos números diferentes que no son números.

 double fcmp(double a, double b) { if (isnan(a)) return a; if (isnan(b)) return b; ... }

Pero echemos un vistazo a un 3-way usado para clasificar como con qsort() . Una pregunta es ¿dónde poner las NAN? Un objetivo común es ponerlos al final de la lista, es decir, todos los NAN son más grandes que otros. Para hacerlo, necesitamos comparar consistentemente , incluso si ambos operandos son NAN con diferentes cargas útiles.

 // All NAN considered greater than others // return 0, a positive or negative int. int fcmp_for_qsort(const void *ap, const void *bp) { double a = *(const double *) ap; double b = *(const double *) bp; if (isnan(a)) { if (isnan(b)) { return 0; } return 1; } if (isnan(b)) -1; return (a > b) - (a < b); }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda