【发布时间】:2015-10-23 16:42:50
【问题描述】:
我需要对已排序数字数组进行优化的二进制搜索算法。我这样做了,发现使用浮点数存储数字比使用整数更快,因为最后我必须计算
(frameNumber-this->frameNumber[imin])/(this->frameNumber[imax]-this->frameNumber[imin])
this->frameNumber[imin] 是小于等于frameNumber 的最大帧数,this->frameNumber[imax] 是大于等于的最小帧数。该代码用于计算这两个关键帧之间的进度。
frameNumber 数组是静态的。我只需要排序一次。但是通过二分查找和上面的代码来多次访问它来计算进度。
从 int 到 float 的转换花费了一些周期。 然后我发现在asm中有很多fpu指令。我担心它们可能比整数慢。
所以问题来了。我可以将排序后的浮点数数组转换为 int* 并对其运行二进制搜索吗?
这意味着:
void binary_search(float key,float* array,...)
{
int key_integer=*(int*)&key;
int* array_intege(int*)array;
binary_search_for_integers(key_integer,array_integer,...);
}
还是我上面的结论是错误的? (比如把int转换成float就不是那么费钱了,还是浮点之间的比较和整数一样快?
非常感谢!
【问题讨论】:
-
你的问题不清楚,但直接的答案是不,你不能像这样转换数组。
-
通常,这不起作用——它将每个元素的位解释为整数而不是浮点数。但是,IEEE 浮点有一个有趣的怪癖,即如果将其解释为相同长度的整数,它们会保持顺序。因此,如果您的系统上的
sizeof(int)==sizeof(float)并且没有任何值是 NaN,则您的二进制搜索实际上可以工作。但 C 或 C++ 标准不保证这一点。 -
它也不适用于负数。
-
在我的机器上进行一些测试后,如果浮点数组中的值都是正数,它在 VS2012 中有效。负值将以相反的顺序排列(这是因为浮点数使用符号位而不是二进制补码)。编辑:看起来你打败了我。
-
int32_t 在 C 标准 C99 中是 32 位的,但未定义浮点大小,它只需要有一个最小范围。 en.wikipedia.org/wiki/C_data_types
标签: c++ c floating-point floating-point-conversion