我尝试遵循“自然对数 (ln) 和求幂的有效实现”主题,以便能够在没有 math.h 的情况下实现对数函数。所描述的算法适用于 1 和 2 之间的值(归一化值)。但是,如果这些值没有被规范化并且我按照规范化说明进行操作,那么我会得到错误的值。
链接:点这里
如果我遵循示例整数值 12510 的代码,我会得到以下结果:
y = 12510 (0x30DE),log2 = 13,除数 = 26,x = 481,1538
float ln(float y) {
int log2;
float divisor, x, result;
log2 = msb((int)y); // See: https://stackoverflow.com/a/4970859/6630230
divisor = (float)(1 << log2);
x = y / divisor; // normalized value between [1.0, 2.0]
result = -1.7417939 + (2.8212026 + (-1.4699568 + (0.44717955 - 0.056570851 * x) * x) * x) * x;
result += ((float)log2) * 0.69314718; // ln(2) = 0.69314718
return result;
}
x 的预期结果应该是 1 < x < 2 的标准化值。但是,我在这个计算中失败了,因为收到的结果是 481,1538。
提前感谢您的帮助