可能有人请帮忙,告诉我如何在包括MSVC ++ 6 IEEE数学函数?我试过和,但我仍然得到这些错误:

  

错误C2065:ilogbf':未声明的标识符

     

错误C2065:scalbnf':未声明的标识符

有帮助吗?

解决方案

编辑3:希望这将是我最后的编辑。我已经认识到,我还没有妥善解决这个问题的。我要离开我的答案在地方作为警世故事,因为它可能有一定的教育意义。但我明白,为什么我是零upvotes,而事实上,我要给予好评安迪·罗斯的回答,因为我认为他是更相关(虽然不完整的,至少在写作的时候)。在我看来,我的错误就是把我找到了ilogbf的人定义()表面上一点。这是需要的日志浮动的整数部分的函数,怎么也该是实施?原来的功能是关于什么的是IEEE浮点表示,尤其是指数(相对于尾数),其代表的一部分。我绝对应该已经意识到,试图回答这个问题之前!一个有趣的问题对我来说是一个功能怎么能找到一个浮动的指数部分,因为我认为C的基本规则是,花车都提升到双打作为一个函数调用的一部分。但是,这是当然的整个单独讨论。

---编辑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;
}

其他提示

这些是C99的功能,不IEEE754-1985。微软似乎已经决定,他们在市场不关心C99的支持,所以他们没有打扰到他们提供。这是一个耻辱,但除非有更多的你(开发商)抱怨,没有理由认为这种情况将会改变。

在全新的754标准,IEEE754-2008,需要这些功能(5.3.3条,“logBFormat操作”),但版本的标准不会为好几年被广泛采用;即使它确实达到广泛应用,微软还没有看到适合提供这些功能为十多年来,他们一直在C99所以他们为什么还要为他们提供只是因为他们在IEEE754标准?

编辑:注意scalb和logb都在IEEE754-1985的附录的“推荐的功能和谓词”定义,但上述附件明确为“不是一部分”所述标准。

如果你知道你是一个IEEE系统(和这些天,你这样做),则不需要这些功能:只需直接unioning双用uint64_t中检查位。想必你在效率摆在首位的兴趣使用这些函数(否则你会使用像log()exp()更自然的操作),所以花一点精力在你的代码相匹配的浮点表示可能是值得的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top