Estoy desarrollando una biblioteca de funciones matemáticas especiales en C. Necesito proporcionar una capacidad para que la biblioteca maneje tanto precisión simple como precisión doble. El punto importante aquí es que las funciones "únicas" deben usar SÓLO aritmética "única" internamente (para las funciones "dobles").¿Diseño adecuado del código C que maneja punto flotante de precisión simple y doble?
Como ilustración, consulte LAPACK (Fortran), que proporciona dos versiones de cada una de sus funciones (SINGLE y DOUBLE). También la biblioteca matemática C (ejemplo, expf y exp).
Para aclarar, yo quiero apoyar algo similar a la (artificial) siguiente ejemplo:
float MyFloatFunc(float x) {
return expf(-2.0f * x)*logf(2.75f*x);
}
double MyDoubleFunc(double x) {
return exp(-2.0 * x)*log(2.75*x);
}
He pensado en los siguientes enfoques:
Uso de macros para el nombre de la función . Esto todavía requiere dos bases de código fuente separados:
#ifdef USE_FLOAT #define MYFUNC MyFloatFunc #else #define MYFUNC MyDoubleFunc #endif
el uso de macros para los tipos de punto flotante. Esto me permite compartir la base de código a través de las dos versiones diferentes:
#ifdef USE_FLOAT #define NUMBER float #else #define NUMBER double #endif
Sólo el desarrollo de dos bibliotecas independientes, y olvidarse de tratar de ahorrar dolores de cabeza.
¿Alguien tiene una recomendación o sugerencias adicionales?
Sí, gracias por ese excelente punto. El objetivo aquí es compensar la velocidad de ejecución del "sencillo" con la ventaja de precisión del "doble". –