c - 如何在 MSVC++6 中声明 'ilogbf' 等 IEEE 数学函数?

标签 c visual-c++ c99 visual-c++-6

有人可以帮助并告诉我如何在 MSVC++6 中包含 IEEE 数学函数吗?我尝试了 和 ,但我仍然遇到这些错误:

error C2065: 'ilogbf' : undeclared identifier

error C2065: 'scalbnf' : undeclared identifier

最佳答案

编辑 3:希望这是我的最终编辑。我开始意识到我根本没有正确解决这个问题。我将保留我的答案作为警示故事,因为它可能具有一定的教育值(value)。但我理解为什么我的投票数为零,事实上我会投票给 Andy Ross 的答案,因为我认为他的答案更相关(尽管至少在撰写本文时还不完整)。在我看来,我的错误是对我为 ilogbf() 找到的 Man 定义有点肤浅。这是一个采用 float 的整数部分的函数,实现起来有多难?事实证明,该函数的真正含义是 IEEE 浮点表示,特别是该表示的指数(与尾数相对)部分。在尝试回答问题之前,我绝对应该意识到这一点!对我来说有趣的一点是函数如何可能找到 float 的指数部分,因为我认为 C 的基本规则是 float 作为函数调用的一部分被提升为 double 。但这当然是一个完全独立的讨论。

--- 编辑 3 结束,警示故事开始 ---

谷歌搜索表明这些是在某些 Unix 版本中定义的,但可能不在任何 Posix 或 ANSI 标准中,因此没有随 MSVC 库一起提供。如果函数不在库中,它们将不会在 math.h 中声明。显然,如果编译器看不到这些外部符号的声明,它就不会高兴,并且您会得到与您列出的错误类似的错误。

明显的变通方法是创建您自己的这些函数版本,使用提供的数学函数。例如

#include <math.h>

int ilogbf( float f )
{
    double d1 = (double)f;
    double d2 = log(d1);
    int ret = (int)d2;
    return ret;
}

编辑:这不太正确。显然,这个函数应该使用以 2 为底的对数,而不是自然对数,这样返回的值实际上是一个二进制指数。它还应采用其参数的绝对值,以便它也适用于负数。如果你在评论中问我,我会开发一个改进的版本,否则我很想把它作为读者的练习:-)

我的回答的本质,即 ANSI C 不需要此功能并且 MSVC 不包含它,显然是正确的。

编辑 2:好的,我已经削弱并提供了一个改进的版本而没有被问到。在这里;

#include <math.h>

int ilogbf( float f )
{
    double d1 = (double)f;
    if( d1 < 0 )
        d1 = -d1;
    double d2 = log(d1) / log(2);  // log2(x) = ln(x)/ln(2)
    int ret = (int)d2;
    return ret;
}

关于c - 如何在 MSVC++6 中声明 'ilogbf' 等 IEEE 数学函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1726890/

相关文章:

C 系统调用 open/read/write/close 和 O_CREAT|O_EXCL

c - 如何在 C 中创建最低有效位设置为 1 的掩码

c - 调试时的以下 C 语句显示 k 的值为 -2。为什么?实际上,它应该显示-2.000000

c++ - VC++ 中的光纤安全优化到底是什么?

c++ - 虚拟成员函数 ptr 的类型推导(错误?)

objective-c - C99 指定初始化程序或 CGMake 宏?

c - 仍然使用 TCP_NODELAY 发送一条消息

visual-c++ - Visual C++ 如何启动应用程序以在远程 PC 上进行调试?

c - 指向整数并再次返回的指针

c - 为什么 gcc 支持 std=gnu89 的 bool 类型?