- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
查看libm中日志操作的实现,有一些数字文字我理解有问题。
从here下载代码
部分代码如下所示。我想知道0x95f64
、0x6147a
和0x6b851
的含义。
if (hx >= 0x7ff00000) return x+x;
k += (hx>>20)-1023;
hx &= 0x000fffff;
i = (hx+0x95f64)&0x100000;
SET_HIGH_WORD(x,hx|(i^0x3ff00000)); /* normalize x or x/2 */
k += (i>>20);
f = x-1.0;
if((0x000fffff&(2+hx))<3) { /* |f| < 2**-20 */
if(f==zero) { if(k==0) return zero; else {dk=(double)k;
return dk*ln2_hi+dk*ln2_lo;}}
R = f*f*(0.5-0.33333333333333333*f);
if(k==0) return f-R; else {dk=(double)k;
return dk*ln2_hi-((R-dk*ln2_lo)-f);}
}
s = f/(2.0+f);
dk = (double)k;
z = s*s;
i = hx-0x6147a;
w = z*z;
j = 0x6b851-hx;
t1= w*(Lg2+w*(Lg4+w*Lg6));
t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
i |= j;
R = t2+t1;
更新:我熟悉十六进制符号。我有兴趣了解代码的内部工作与正文 header 中描述的算法/方法的关系。为什么使用这些特定值,使用目的是什么?
最佳答案
sqrt(2)的iee754表示的高32位字是0x3ff6a09e,其中最高12位(即0x3ff)代表指数,低20位0x6a09e代表尾数的第一部分。 (1<<20)-0x6a09e 是 0x95f62。在算法部分,使用了数字 0x95f64,我们检查在移除所有 2 的幂(这使得 x 在范围 1..2 中)之后我们是否仍然有 x>sqrt(2),在这种情况下我们将 x 除以 2。但是,我不清楚为什么使用 0x95f64 而不是 0x95f62。
这部分
i = hx-0x6147a;
w = z*z;
j = 0x6b851-hx;
t1= w*(Lg2+w*(Lg4+w*Lg6));
t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
i |= j;
R = t2+t1;
if(i>0) {
在来源中有以下评论
/* In order to guarantee error in log below 1ulp, we compute log
* by
* log(1+f) = f - s*(f - R) (if f is not too large)
* log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy)/
检查 if ((hx-0x6147a)|(0x6b851-hx))>0 实际上是检查 hx 是否在范围内0x6147a 和 0x6b851。高字0x3ff6147a的 float 约为1.38,高位0x3ff6b851的 float 约为1.42,即略小于sqrt(2),略大于sqrt(2)。尚不确定这些数字是否重要。
关于c - 在 libm 的日志操作中理解数字文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19025084/
有没有人试图用glibc编译-march=corei7来查看与默认的Linux x68_64发行版相比是否有性能改进? GCC使用-march=i686编译。我认为(不确定)数学库也是以相同的方式编译
当我尝试编译我的应用程序时,出现以下错误: *** No rule to make target `/mypath/lib/libm.a', needed by `/myPath/bin/appNam
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: Why do you have to link the math library in C? 当我编写一个使用 ma
我试图编译一个包含 的源文件.但是我成功地创建了一个可执行文件,没有链接到 libm.a 没有错误. 我输入的命令是 gcc -Wall filename.c -o executablename 我
据我所知,一些数学函数包含在 libc 中,而另一些则包含在 libm 中。我通过实验发现: $ nm --dynamic --defined-only /lib/x86_64-linux-gnu/l
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
查看libm中日志操作的实现,有一些数字文字我理解有问题。 从here下载代码 部分代码如下所示。我想知道0x95f64、0x6147a和0x6b851的含义。 if (hx >= 0x7ff0000
我正在编译以下代码: #include #include main() { int x=2, y=3; pow(2,3); pow(x,y); } 如果我将其编译为“gcc
我有一个调用 sin、cos 和 acos 的 c 程序。编译时出现以下错误: /tmp/ccDfW98S.o: In function `zip_search': main.c:(.text+0xf
是否有针对 ARM(v6) 处理器优化的 libm (libmath)? 我正在查看 GNU 实现,它似乎没有优化(但它确实有 x86 的)。似乎 libm 的大多数实现都没有针对 ARM 的优化。
我想编译一些非常基本的测试代码,调用日志函数,然后使用英特尔 C 编译器在 Linux 上的标准输出上打印结果。我希望代码链接到 libimf(英特尔的数学函数库)而不是 GNU libm,这样我就可
我只是想弄明白,为什么 Fedora 没有静态库 libm.a,如果这是事实,我应该使用?如前所述 here在 StackOverflow 中,我可以简单地从 yum 安装 pkg,但认为 Fedor
我想下载并编译 libm(GNU 的 may 库)的源代码。 有人可以指出我正确的位置/存储库吗? 最佳答案 它包含在 C 标准库中:Glibc 关于gnu - gnu lib math (libm)
我想稍微修改 libm 的 sin 函数(来源:s_sin.c)来尝试一些数值。但是,我不知道如何编译修改后的源代码。 我想避免执行“./configure, make”。因此,为了解决所有依赖关系,
我使用以下命令在 shell 中成功编译了我的程序。它生成示例二进制文件并正常工作。 gcc -g -o build/debug/example -Iinclude docs/example.c \
我有一台没有 sudo 权限的 centOS 机器。 我需要使用 librosa python 包,所以我安装了 Anaconda 并通过 conda 安装了该包。 但是,当我导入这个包时,我得到 I
linux下C程序中的.a文件是什么?是库文件吗? To merge with the math library libm.a you would type cc -o program_name p
我正在 pow 上测试极端情况调用( #include ),特别是 pow(-1, Inf) . 在我的桌面 (Ubuntu) 上,我得到结果 1.0,这符合 2008 IEEE 浮点规范。 我在运
我想有选择地静态链接 libm.a,动态链接所有其他库(包括 libc.so)。但是,如果我使用 math.h 中的数学函数,它几乎总是 无法正确链接。为什么?为什么它有时会起作用? (例如,如果我只
在 Android Studio 中使用 NDK Cmake 构建系统时,是否可以链接 platforms\android-XX\arch-arm\usr\lib*.a 版本的库?我正在使用 LLVM
我是一名优秀的程序员,十分优秀!