- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试遵循“自然对数 (ln) 和指数的高效实现”主题,以便能够在没有 math.h 的情况下实现对数函数。所描述的算法适用于 1 和 2 之间的值(归一化值)。但是,如果这些值未标准化并且我遵循了标准化说明,那么我会得到错误的值。
链接:Click here
如果我遵循示例整数值 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。
在此先感谢您的帮助
最佳答案
出于好奇,我尝试重现:
#include <stdio.h>
int msb(unsigned int v) {
unsigned int r = 0;
while (v >>= 1) r++;
return r;
}
float ln(float y)
{
int log2;
float divisor, x, result;
log2 = msb((int)y); // See: https://stackoverflow.com/a/4970859/6630230
printf("log2: %d\n", log2);
divisor = (float)(1 << log2);
printf("divisor: %f\n", divisor);
x = y / divisor; // normalized value between [1.0, 2.0]
printf("x: %f\n", x);
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;
}
int main()
{
printf("ln(12510): %f\n", ln(12510));
}
输出:
log2: 13
divisor: 8192.000000
x: 1.527100
ln(12510): 9.434252
我刚刚在我的 Windows 7 袖珍计算器中尝试了这个并得到:
9.434283603460956823997266847405
前 5 位数字相同。 – 其余的我会认为是四舍五入的问题,不知道哪个更接近。
但是,问题中有一个错字(或错误):
y = 12510 (0x30DE), log2 = 13, divisor = 26, x = 481,1538
divisor = (float)(1 << log2);
与 log2 = 13
产量 8192
.
log2 << 1
会导致 26
.
为了好玩,我把这行改成了divisor = (float)(log2 << 1);
并得到以下输出:
log2: 13
divisor: 26.000000
x: 481.153839
ln(12510): -2982522368.000000
所以,这让我有点困惑:
公开的代码似乎是正确的,但 OP 似乎将其解释(或类似)错误。
关于c - 自然对数 (ln) 和求幂的实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58570282/
我知道符号链接(symbolic link)和硬链接(hard link)的基本原理或理论区别。但我仍然对它们的用法或应用场景感到困惑。 Where 'ln' or 'ln -s' is often
我知道该函数执行了 ln(N)/ln(K) 次;但平均而言它执行了 K 次操作吗? 问题: 有没有证据表明 k*ln(N)/ln(K) 是平均执行次数? 如果这个公式是正确的,那么三元搜索将是最快的搜
这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。 当
这个问题在这里已经有了答案: What are the complexity guarantees of the standard containers? (3 个答案) 关闭 10 年前。 没有标
我是 macosx 上 shell 编程的新手,遇到了一些小问题。我编写了以下 shell 脚本: #!/bin/sh function createlink { source_file=$1 tar
我计划为此在 coreutils 上提交一个错误,因为这种行为是出乎意料的,并且在现实世界中没有任何实际用途......虽然一开始它确实让我发笑,因为我从来没有甚至知道可以创建文件名中带有通配符的文件
有人熟悉 etcd 项目吗?或者我们在谈论这个问题时最好忘记项目。问题是 $ build ln: `gopath/src/github.com/coreos/etcd': cannot overwri
1.命令简介 ln 命令用来为文件创建链接,分为硬链接(hard link)和软链接(符号链接,symbolic link)两种,默认创建硬连接,如果要创建软链接须使用 -s 选项。本文介绍的是
所以我基本上有一个目录 A 那总是存在的。我想用符号链接(symbolic link)替换这个目录(这将在我的部署脚本中完成)。 我试过ln -sf app/cache A但它不起作用,它在 内部创建
我有一个宏来创建链接 makeLink($BUILD_ROOT/lib somewhere/somelibrary.so makelinks) 这样做的目的是使一个完整的构建包含一个类似于开发人员安装
我要实现公式: #include #include #include using namespace std; int main(){ double a, eps = numeric_l
我需要找到一种方法,在安装后将其他名称链接到已安装的可执行文件。 下面的例子很接近,除了两个问题。第一,链接是在每个目标之后完成的,而不仅仅是安装。第二,链接是在构建目录中创建的,而不是在安装目录中(
我尝试遵循“自然对数 (ln) 和指数的高效实现”主题,以便能够在没有 math.h 的情况下实现对数函数。所描述的算法适用于 1 和 2 之间的值(归一化值)。但是,如果这些值未标准化并且我遵循了标
我刚刚找到了 problem 的解决方法安装 MacPorts 版本的 python 时,我正在使用 Sublime Text 3 的 subl 命令。说明说要在您的/bin 中放置一个软链接(sof
我正在尝试为 ln(1.9) 建立一个精度在十位数以内的近似值(因此为 .641853861)。 我正在使用我从 ln[(1 + x)/(1 - x)] 构建的简单函数 到目前为止,这是我的代码: #
只是想知道我尝试删除它有什么问题。因为我必须使用我的教授声明的变量 LN** map = nullptr; 对于我正在处理的作业,使用更简单的数据类型不是一种选择。 class LN { public
loge(a) 取一个非零正实数 a。 在函数中,x = a/3。 y = x-1+a*exp(-x)。我将继续将它们彼此相减(得到绝对差值)并一直持续到差值小于 0.000001。我的 friend
这只是一个练习。我不是想利用什么...... 我有一个 setuid 玩具程序可以利用(反编译版本): int main(int argc, const char **argv) { int v3
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在寻找 log() 的实现和 exp() C 库中提供的函数 .我正在使用 8 位微 Controller (OKI 411 和 431)。我需要计算 Mean Kinetic Temperat
我是一名优秀的程序员,十分优秀!