- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在查看 git 中的 _math.c(第 25 行):
#if !defined(HAVE_ACOSH) || !defined(HAVE_ASINH)
static const double ln2 = 6.93147180559945286227E-01;
static const double two_pow_p28 = 268435456.0; /* 2**28 */
我注意到 ln2 值与 ln2 的 what wolframalpha 值不同。 (光头部分就是区别)
ln2 = 0.693147180559945286227(cpython)
ln2 = 0.6931471805599453094172321214581 (wolframalpha)
ln2 = 0.693147180559945309417232121458(维基百科)
所以我的问题是为什么会有差异?我错过了什么?
最佳答案
如 user2357112 所述,此代码来自 FDLIBM。这是为 IEEE-754 机器精心编写的,其中 C double 具有 53 位精度。它并不真正关心 2 的实际对数是多少,而是非常关心 log(2)
的最佳 53 位近似值。
要重现预期的 53 位精确值,17 decimal digits would have sufficed .
那么为什么他们改用 21 位十进制数字呢?我的猜测:21 位十进制数字是保证转换结果正确到 64 位精度所需的最少数字。如果编译器以某种方式决定将文字转换为 Pentium 的 80 位浮点格式(具有 64 位精度),那么这可能在当时是个问题。
因此他们显示了具有足够十进制数字的 53 位结果,以便如果将其转换为具有 64 位精度的二进制浮点格式,则尾随的 11 位 (=64-53) 将全部为零,从而确保它们从一开始就使用预期的 53 位值。
>>> import mpmath
>>> x = mpmath.log(2)
>>> x
mpf('0.69314718055994529')
>>> mpmath.mp.prec = 64
>>> y = mpmath.mpf("0.693147180559945286227")
>>> x == y
True
>>> y
mpf('0.693147180559945286227')
在英文中,x
是log(2)
的53位精确值,y
是小数化后的结果将代码中的字符串转换为具有 64 位精度的二进制浮点格式。它们是相同的。
在当前的现实中,我希望所有编译器现在都将文字转换为 native IEEE-754 double 格式,精度为 53 位。
无论哪种方式,代码都会确保使用 log(2)
的最佳 53 位近似值。
关于python - cpython _math.c 中的 ln2 const 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48644767/
我知道符号链接(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
我是一名优秀的程序员,十分优秀!