问题标签 [libm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1595 浏览

debian - 如何安装 AMD LibM?

我正在尝试将AMD LibM安装到我的 linux debian 但我不知道如何安装。

我下载了:

amdlibm-3.1-lin64.tar.gz

适用于 Linux® 的 AMD LibM 库。使用 GCC 4.7.2 构建

但是它只带有以下文件夹:include,lib

我应该做些什么?我正在尝试将 amdlibm 与 theano 一起使用

0 投票
1 回答
728 浏览

c - Fedora 动态替换 libm.a(静态库)?

我只是想弄清楚,为什么Fedora没有静态库libm.a,如果这是事实,我应该使用哪个?正如StackOverflow中提到,我可以简单地从安装pkg,但是认为Fedora有一个替代品作为默认是可以接受的。不是吗?yum


已编辑

我正在尝试编译这个:

输出是这样的:

lm用and/usr/lib/libm.a和 and测试 ggc/usr/lib64/libm.a

我已经完成了所有在这里和其他帖子,yum install glibc-static并检查了/usr/lib64/libm.so


编辑

repoquery --whatprovides /usr/lib64/libm.a

谢谢。

0 投票
1 回答
333 浏览

haskell - 在 Haskell 中使用系列的自然对数给出不精确的结果

所以我写了两个函数来计算变量x的自然对数,将增量和的上界增加到33000后,在ghci中测试的函数仍然返回不精确的结果,与从Prelude导入的默认log函数相比,这里是代码定义:

以及测试结果:

那么为什么结果会有所不同,正确计算自然对数的正确方法是什么(如 Prelude 中的 log 函数)?

0 投票
3 回答
470 浏览

c - 我*不*希望函数 exp 正确舍入

Debian系统上C数学库的GCC实现显然具有 (IEEE 754-2008) 兼容的 function 实现,这意味着舍入应始终正确:exp

来自维基百科)IEEE 浮点标准保证加、减、乘、除、融合乘加、平方根和浮点余数将给出无限精度运算的正确舍入结果。1985 年标准中没有为更复杂的功能提供这样的保证,它们通常最多只能精确到最后一位。但是,2008 标准保证符合标准的实现将给出正确的舍入结果,该结果尊重主动舍入模式;然而,功能的实​​现是可选的。

事实证明,我遇到了这个特性实际上阻碍的情况,因为exp函数的确切结果通常几乎正好在两个连续double值之间的中间(1),然后程序进行了大量的进一步计算,丢失速度高达 400 倍(!):这实际上是对我的(问得不好的 :-S)问题 #43530011的解释。

(1) 更准确地说,当 的参数exp变成 (2 k + 1) × 2 -53的形式,其中k是一个相当小的整数(例如 242)时,就会发生这种情况。特别是,当是 2 -44pow (1. + x, 0.5)的数量级时,所涉及的计算倾向于exp使用这样的参数调用。x

由于在某些情况下正确舍入的实现可能非常耗时,我猜开发人员也会设计一种方法来一次获得稍微不那么精确的结果(例如,最多只能达到 0.6 ULP 或类似的结果)对于给定范围内的每个参数值(大致)有界......(2)

......但是怎么做呢?

(2) 我的意思是,我只是不希望参数的某些异常值(例如 (2 k + 1) × 2 -53 )比大多数相同数量级的值更耗时;但是我当然不介意参数的某些异常值是否更快,或者大参数(绝对值)是否需要更长的计算时间。

这是一个显示该现象的最小程序:

现在之后gcc -std=c99 program53.c -lm -o program53

另一方面,使用program52and (通过分别program54替换和得到):0x200000000000000x100000000000000x40000000000000

请注意,这种现象是依赖于实现的!显然,在常见的实现中,只有Debian系统(包括Ubuntu)的实现会出现这种现象。

P.-S.:我希望我的问题不是重复的:我彻底搜索了一个类似的问题但没有成功,但也许我确实注意到使用了相关的关键字...... :-/

0 投票
2 回答
557 浏览

c++ - 如何在 gcc 中使用 Intel 的数学函数库?

我正在尝试以下操作: gcc -o foo foo.c -L /path/to/directory/containing/libimf.so -limf 并且我在 foo.c 中使用了“log2”函数。我希望它与英特尔优化的库函数链接,但出现以下错误

/usr/bin/ld: skipping /path/to/libimf.so when searching for -limf

/usr/bin/ld: cannot find -limf

collect2: error: ld returned 1 exit status

0 投票
0 回答
265 浏览

gcc - GNU ARM 嵌入式工具链库许可证

我正在为 GNU ARM Embedded Toolchain 构建的 MCU 开发商业软件。我想出售设备(产品),我不希望发布源代码。当我使用 a 编译我的代码时,-Wl,--verbose我看到我的程序使用了这些库:

所以我的问题是:我可以将它们用于我的目的吗?我明白,根据license.txt,那libc是一个newlibor newlib-nano,我需要小心,因为每个部分都在不同的许可下,对吧?libm, libgcc, libstdc++ , crtend, crtn未涵盖的其他使用的库( ,..)怎么样license.txt,我可以将它们用于我的目的吗?它们是根据哪个许可证发布的?

0 投票
0 回答
117 浏览

c++ - 与 VM ubuntu 服务器 12 相比,基于 C++ libm 的程序在裸机 ubuntu 服务器 16 上花费了太多时间

我正在尝试在 Ubuntu 服务器上运行数学密集型 C++ 程序,令人惊讶的是,在裸机 Core i7 6700 上运行的 Ubuntu Server 16 比在同一台机器上的 Windows 10 上的 VM 上运行的双核 Ubuntu 服务器 12.04.5 花费的时间更多. 看到这个结果完全令人惊讶。我在两者上都使用 GCC 版本 5.4.1。还尝试使用 -Ofast 和 -ffast-math 进行编译,但没有任何区别。还尝试在裸机上获取最新的 gcc 7.2,但同样没有任何区别。还尝试获取最新的 libm (glibc) 并尝试在数字上没有任何差异。有人可以帮忙让我知道哪里出了问题吗?

还在程序上运行 callgrind(我使用第三方 so 库,因此无法控制它),我看到大部分时间都花在了 libm 上。除了服务器版本之外,这两个环境之间的唯一区别是 libm 版本。在表现良好的 VM 上是 2.15,而在需要更多时间的裸机上是 2.23。任何建议将不胜感激。谢谢。

构建命令是:

该程序将使用源代码不可用的库来计算一组 22 个执行价格的期权希腊字母。但是能够回答测试代码的任何问题。

使用以下类简化了延迟计算:

现在得到的时间如下:

我可以理解 Windows 10 在 VM 上的性能比 linux 快,但为什么裸机 ubuntu 这么慢?

在下面粘贴整个测试代码时无法得出任何结论。请帮忙(真的很想知道它为什么会这样)。

callgrind 图如下: callgrind graph

更多更新:在同一 g++ 7.2 上的 baremetal 和 vm ubuntu 上尝试了 -fopenacc 和 -fopenmp。vm 显示了一些改进,但裸机 ubuntu 一次又一次地显示相同的数字。此外,由于大部分时间都花在 libm 中,有没有办法升级该库?(glibc)?虽然在 apt-cache 中看不到它的任何新版本

使用 callgrind 并使用点绘制图形。据此,在 libm exp(版本 2.23)中需要 42.27% 的时间,在 libm 日志中需要 15.18% 的时间。

终于找到了一个类似的帖子(所以贴在这里给别人看):The program running 3 times faster when compiled with g++ 5.3.1 than the same programcompile with g++ 4.8.4, the same command

怀疑的问题来自库(根据帖子)。通过设置 LD_BIND_NOW,执行时间大幅下降(现在少于 VM)。此外,该帖子还有几个指向为该版本的 glibc 提交的错误的链接。将通过并在此处提供更多详细信息。然而,感谢所有宝贵的投入。

0 投票
0 回答
120 浏览

c - 是否有使用 VEX 指令的标准数学库版本?

我有这个大型库,其中混合了常规 C++、许多 SSE 内在函数和一些无关紧要的程序集。我已经达到了我想以 AVX 指令集为目标的地步。

为此,我想用 gcc-mavx或 MSVC构建整个东西,/arch:AVX这样我就可以在任何需要的地方添加 AVX 内在函数,而不必担心内部的 AVX 状态转换。

我发现的唯一问题是标准 C 数学函数:sin(),exp()等。它们在 linux 系统上的实现使用没有 VEX 前缀的 SSE 指令。我还没有检查过,但我预计 Windows 上会出现类似的问题。

该代码使用了大量对数学函数的调用。一些快速的基准测试表明,一个简单的调用sin()会稍微慢一些(~10%)或慢很多(3x),具体取决于确切的 CPU 以及它如何处理 AVX 转换(Skylake 与旧版本)。

VZEROUPPER在调用之前添加 a对 Skylake CPU 有很大帮助,但实际上会使 Skylake 上的代码变慢一些。似乎正确的解决方案是数学函数的 VEX 编码版本。

所以我的问题是:是否有一个相当有效的数学库可以编译为使用 VEX 编码指令?其他人如何处理这个问题?

0 投票
0 回答
150 浏览

gcc - sqrtf中的双除法?[更新]

我在 STM32F0 上使用浮点运算(软件实现),并在清单中发现了一些奇怪的东西。一旦我使用 sqrtf,链接器就会添加 __aeabi_ddiv,它是 ~1.6kB 的内存。

此代码示例链接到 ddiv:

删除 sqrtf 也会删除 ddiv。所以我的问题:

  • 这是预期的行为吗?

  • 如果没有,我该如何解决。

  • 没有双倍可以做 sqrt 吗?

编译器:arm-atollic-eabi-gcc

sqrtf 列表(ddiv 在 0x800543e):

更新我想我找到了原因,但仍然不太明白。 sqrtf的来源

双除法是异常处理的一部分,虽然 0.0/0.0 应该在编译时完成,对吧?如果我直接调用 __ieee754_sqrtf ddiv 是不链接的。这解决了我的问题,但我想知道如何使用 sqrtf 来做到这一点。

0 投票
1 回答
108 浏览

c - 更改源代码后编译 GNU libm 的 s_sin.c

我想稍微修改 libm 的sin函数(来源:s_sin.c)来试验一些数值。但是,我看不到如何编译修改后的源代码。

我想避免做“./configure, make”。因此,为了解决所有依赖关系,我尝试在我的系统中使用 libm.a 编译 s_sin.c。但是我的编译器很快就拒绝了编译,因为它在源文件中找不到头文件“mydefs.h”。源码中有很多这样的头文件。

我的问题是:在 GNU libm 中尝试更改单个数学函数并进行编译的最简单方法是什么?谢谢。