Правильное проектирование кода на C, который обрабатывает как одинарную, так и двойную точность плавающей точки?

Я разрабатываю библиотеку специализированных математических функций на языке 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);
}

Я думал о следующих подходах:

  1. Использование макросов для имени функции. Это все еще требует двух отдельных исходных текстов:

    #ifdef USE_FLOAT
    #define MYFUNC MyFloatFunc
    #else
    #define MYFUNC MyDoubleFunc
    #endif
    
  2. Использование макросов для типов с плавающей запятой. Это позволяет мне разделить кодовую базу между двумя различными версиями:

    #ifdef USE_FLOAT
    #define NUMBER float
    #else
    #define NUMBER double
    #endif
    
  3. Просто разрабатываем две отдельные библиотеки и забываем о попытках сэкономить на головной боли.

Есть ли у кого-нибудь рекомендации или дополнительные предложения?

8
задан David H 27 October 2011 в 19:14
поделиться