1

如果我们查看 C11 的草案,则保留了以下名称:

7.31 Future library directions
The following names are grouped under individual headers for convenience. All external
names described below are reserved no matter what headers are included by the program.
7.31.1 Complex arithmetic <complex.h>
The function names
cerf cerfc cexp2 cexpm1 clog10 clog1p clog2 clgamma ctgamma
and the same names suffixed with f or l may be added to the declarations in the
<complex.h> header.

由于我非常希望将复杂的 gamma 函数视为标准 C 的一部分(因为它们是许多其他复杂函数的基础),所以我想知道 7.31.1 子句的真正含义是什么。

为什么只添加声明而不添加它们的定义?

我们可以期待它们用于下一个 C 标准或次要版本吗?(如果答案是肯定的,预计下一个标准何时发布?)

是否有任何实现已经可用作编译器的非标准扩展?

4

2 回答 2

3

几个月前,我发布了一个库libcerf,它提供了缺失的函数 cerf 和 cerfc,基于 Steven G. Johnson 的数字代码。我们的实现精确到 13-14 位,这对于几乎所有实际用途来说已经足够了 - 但在实现这一点时,人们明白需要做多少工作才能编写一个可接受的标准:这不太可能会进行任何人很快。

所以关于你关于 clgamma 和 ctgamma 的问题:不要等待标准。搜索可以正常工作的代码。理想情况下,包装此代码并提供一个类似于 libcerf 的库,该库几乎与标准实现一样好。

于 2013-05-12T08:59:49.977 回答
0

glibc 的维护者几乎从不想添加没有以任何方式标准化的新功能,而且 cerf 不是 C99 标准的一部分——它只是为将来可能使用而保留的,这使得 glibc 不太可能接受直到函数的所需行为标准化为止。

不过,如果它被合并,那肯定会很好,就像 C++ 代码中的“erf()”,而是“cerf()”。

根据手册:

cerf[f|l]C99 可选的复杂错误函数,如果提供,则必须在 complex.h 中声明。

根据上述声明,在提供时才声明函数。

于 2013-04-01T09:33:40.230 回答