c - 处理单精度和 double 浮点的 C 代码的正确设计?

标签 c floating-point

我正在用 C 语言开发一个专用数学函数库。我需要为该库提供处理单精度和 double 的能力。这里的重点是“单”函数应该在内部仅使用“单”算术(分别用于“双”函数)。

作为示例,请查看 LAPACK (Fortran),它为每个函数提供了两个版本(SINGLE 和 DOUBLE)。还有 C 数学库(例如,expfexp)。

为了澄清,我想支持类似于以下(人为的)示例的内容:

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. 只是开发两个独立的库,而忘记了如何避免头痛。

有没有人有推荐或其他建议?

最佳答案

对于多项式逼近、插值和其他固有的逼近数学函数,您不能在 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/

相关文章:

c - 动态分配的 2D 空间的内存管理

c - 文件系统性能

php - 显示不带科学计数法的浮点值

python - 截断 f 字符串 float 而不舍入

c++ - 其他文件中的静态函数访问

c - 强制 C 编译器不内联数组中的条目

C/C++ 校验位

c++ - 16 位 float 和 GL_HALF_FLOAT

sql-server - MSSQL 数据库中浮点字段中的 NaN 值

c - 为什么两个浮点乘法给出的答案与一个不同?