我正在用 C 语言开发一个专用数学函数库。我需要为该库提供处理单精度和 double 的能力。这里的重点是“单”函数应该在内部仅使用“单”算术(分别用于“双”函数)。
作为示例,请查看 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
只是开发两个独立的库,而忘记了如何避免头痛。
有没有人有推荐或其他建议?
最佳答案
对于多项式逼近、插值和其他固有的逼近数学函数,您不能在 double 和单精度实现之间共享代码,否则要么在单精度版本中浪费时间,要么在 double 版本中比必要的更近似-精度一。
然而,如果您走单一代码库的路线,以下内容应该适用于常量和标准库函数:
#ifdef USE_FLOAT
#define C(x) x##f
#else
#define C(x) x
#endif
... C(2.0) ... C(sin) ...
关于c - 处理单精度和 double 浮点的 C 代码的正确设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7921108/