¿Por qué no pueden compararse los tipos de punto flotante utilizando la función memcmp ()?

bool floatcmp(const float a, const float b) { const void *p = (void*)&a; const void *q = (void*)&b; if (memcmp(p, q, sizeof(float)) == 0) return true; return false; } 

El código de ejemplo está arriba, la página del memcmp(x,y)==0 dice que memcmp(x,y)==0 no implica que x==y los tipos de punto flotante a menudo tengan un valor llamado NaN (‘no es un número’) con la propiedad de que NaN = = NaN es falso. Pero cambio el tipo a void * y creo que el comstackdor no sabe que es un número flotante.

Pueden compararse con memcmp() : SIN EMBARGO, esa comparación es una comparación byte por byte, que no tiene relación con la interpretación numérica de esos bytes. Siempre y cuando todos los valores sean no especiales (los distintos sabores de Inf / NaN, etc.) y estén normalizados, debería ser una prueba confiable para la igualdad exacta , pero no hay garantía de eso, ni hay ninguna garantía de que sea más rápida que una prueba de igualdad exacta normal a == b (que, por cierto, tiene la misma preocupación de que la mayoría de los números fraccionarios no se pueden representar exactamente en coma flotante), por lo que dos números que deberían ser iguales no están representados de esa manera por su flotante Aproximaciones puntuales.

EDITAR: Aparte de eso, me parece que la clasificación podría ser el único lugar donde una comparación exacta podría ser relevante para los números de punto flotante; si le dice a qsort que los números son ‘iguales’ en el ‘ bien, su diferencia es menor que 2e sentido, luego la clasificación los colocará en un orden indeterminado, por lo que parece que el orden dado por una prueba de igualdad exacta debería ser tan bueno como cualquier otro orden.