c - 如何反转2的分数幂的定点二进制对数算法?
问题描述
我在对这个问题的回答中找到了一个固定点的快速二进制对数算法: Fast fixed point pow, log, exp and sqrt,基于Clay S. Turner 的算法。是否可以“反转”它来计算两个的分数幂?例如:
// log2(3) = 1.5849609375
log2fix(196608, 16) == 103872
pow2fix(103872, 16) == 196608
这是 Dan Molding 的代码:
#include <errno.h>
#include <stddef.h>
#include "log2fix.h"
int32_t log2fix (uint32_t x, size_t precision)
{
int32_t b = 1U << (precision - 1);
int32_t y = 0;
if (precision < 1 || precision > 31) {
errno = EINVAL;
return INT32_MAX; // indicates an error
}
if (x == 0) {
return INT32_MIN; // represents negative infinity
}
while (x < 1U << precision) {
x <<= 1;
y -= 1U << precision;
}
while (x >= 2U << precision) {
x >>= 1;
y += 1U << precision;
}
uint64_t z = x;
for (size_t i = 0; i < precision; i++) {
z = z * z >> precision;
if (z >= 2U << (uint64_t)precision) {
z >>= 1;
y += b;
}
b >>= 1;
}
return y;
}
解决方案
推荐阅读
- javascript - 出于某种原因,我的图像被“变形”并且在不同的浏览器中看起来不同
- asp.net-core - ArgumentNullException:字符串引用未设置为字符串的实例。参数名称:s System.Text.Encoding.GetBytes(string s)
- angular - Jenkins - Jasmine 记者不会为量角器 E2E 测试生成报告
- angular - 如何将 Angulartics2 与 ApplicationInsights 一起使用
- python - Django-filter,如何进行多个字段搜索?(使用 django 过滤器!)
- docker - 运行一个启动 systemd 服务的容器
- html - 导航栏的媒体查询在移动设备上不起作用
- python - 如何更改熊猫图中小提琴图的边框颜色?
- flutter - 如何在不使用颤振中的分割的情况下向滑块添加离散点
- matplotlib - Matplotlib/Seaborn:箱线图在 x 轴上折叠