Я разрабатываю библиотеку специализированных математических функций на языке C. Мне нужно обеспечить возможность работы библиотеки как с одинарной, так и с двойной точностью. Важным моментом здесь является то, что "одинарные" функции должны использовать ТОЛЬКО "одинарную" арифметику внутри (соответственно, для "двойных" функций).
В качестве иллюстрации посмотрите на LAPACK (Fortran), который предоставляет две версии каждой из своих функций (SINGLE и DOUBLE). Также математическая библиотека языка C (пример, expf и exp).
Чтобы пояснить, я хочу поддерживать что-то похожее на следующий (надуманный) пример:
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);
}
Я думал о следующих подходах:
Использование макросов для имени функции. Это все еще требует двух отдельных исходных текстов:
#ifdef USE_FLOAT
#define MYFUNC MyFloatFunc
#else
#define MYFUNC MyDoubleFunc
#endif
Использование макросов для типов с плавающей запятой. Это позволяет мне разделить кодовую базу между двумя различными версиями:
#ifdef USE_FLOAT
#define NUMBER float
#else
#define NUMBER double
#endif
Просто разрабатываем две отдельные библиотеки и забываем о попытках сэкономить на головной боли.
Есть ли у кого-нибудь рекомендации или дополнительные предложения?