有人可以帮助并告诉我如何在 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/