【发布时间】:2012-05-16 20:37:01
【问题描述】:
我有一个float、f,在 1 到 0 的范围内,我想映射到一个 int、i。 f 与 i 相关:
f = 1/(2^i)
所以
i = log2(1/f)
我使用以下公式计算i:
int i = log2f(floorf(1/f));
这个表达式涉及 3 个浮点运算,所以我认为它的效率相对较低。
我的问题:
- 一般来说,这是低效的吗? (我明白,由于平台相关的优化,这很难回答)
- 是否可以创建更高效的算法?看到这涉及到
2^n,我想可以使用ints 和位移来创建更有效的算法。
【问题讨论】:
-
@Vlad 不错!固定。
-
为什么要铺两次地板?为什么不 i = log2f(1/f) ?
-
当“相对而言”时,它是相对于什么?与整数减法相比,没有 FPU 的嵌入式系统上的浮点日志功能非常慢,但在现代桌面上,它会比打开文件快得多。
-
@StephenNutt 好点。我已将短语更改为“一般而言”。
-
可能会进行重大的性能优化,但它们都需要缩小问题范围。如果这适用于单个 CPU 架构,您需要什么精度,i 和 f 是否有范围限制?至于问题 1,不知道这个操作执行的频率有多高,所以无法回答。
标签: c performance algorithm