【发布时间】:2012-02-23 11:07:49
【问题描述】:
我需要在 C++ 中快速实现 log2(float x) 函数。
我发现了一个非常有趣的实现(而且速度非常快!)
#include <intrin.h>
inline unsigned long log2(int x)
{
unsigned long y;
_BitScanReverse(&y, x);
return y;
}
但是这个函数只适用于输入中的整数值。
问题:有没有办法把这个函数转换成double类型的输入变量?
UPD:
我找到了这个实现:
typedef unsigned long uint32;
typedef long int32;
static inline int32 ilog2(float x)
{
uint32 ix = (uint32&)x;
uint32 exp = (ix >> 23) & 0xFF;
int32 log2 = int32(exp) - 127;
return log2;
}
比上一个例子快很多,但是输出的是无符号类型。
是否可以让这个函数返回一个double类型?
提前致谢!
【问题讨论】:
-
这是一个非常奇怪的要求,因为以 2 为底的对数很少用于任何事情,除了计算某事物的位数并且在计算位数时使用整数。那你需要它做什么?
-
@JanHudec:在我的脑海中,对数的两个常见用途是计算信号的熵,以及对非常大的数字进行算术运算,否则会溢出。
-
@MikeSeymour:对于信号,很少使用浮点数而不是整数。对于大数的算术,您不需要以 2 为底,并且可能使用自然对数,因为数学通常用它来表示。
-
@JanHudec:好吧,如果它比整数更方便,我会使用浮点来表示信号的属性;我可能会选择 2 作为任意基数,因为这可能比自然对数计算得更快;但这只是我。没有必要争论它,或者 OP 是否应该对快速对数感兴趣。
-
@MikeSeymour:问这个问题总是有意义的。如果我们知道问题或至少知道问题域,那么完全使用其他东西可能会更有效。
标签: c++ performance