问题标签 [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.
math - 计算最大浮点误差
pow(x,y)
计算为e^(y*log(x))
通常数学库log(x)
以四精度计算(这很耗时),以避免在计算时精度损失,y*log(x)
因为精度误差会在计算中放大e^(y*log(x))
。现在,如果我想pow(x,y)
在以下步骤中进行计算。
此函数的最大 ULP 错误是多少。我知道 IEEE-754 标准规定任何浮点运算的 ULP 误差应小于 0.5,即0.5*2^(-52)
. 因此,如果我的操作y*log(x)
出现 0.5 ULP 错误,我如何计算最大可能的 ULP 错误e^(y*log(x))
同意计算pow(x,y)
相当复杂。算法通常log(x)
以更高的精度计算,并且两者之间的乘法y
并不log(x)
简单。由于 ULP 误差取决于y*log(x)
,因此最大误差将针对 的最大值Y*log(x)
不是e^(y*log(x))
无穷大。正确的?对于这种情况,我如何计算 ULP 的数量?双精度格式的尾数的最大位数是多少,在最大值的情况下会与实际值不同y*log(x)
?
更新了问题。感谢所有的帮助!
那么 10 位差异会导致多少 ULP 错误?我计算为,
其中 e 是实际数字的指数,p=53 表示双精度。我读到我 ULP = 2^(e-(p-1)) 假设,
现在
这个对吗?
android - Linking errors when using functions from in using API level 22
I'm porting a C and C++ library that currently works on iOS to be used on an Android application. I'm down to these last 3 linker errors (obfuscated for privacy reasons):
/Users/fer662/projects/xxx/jni/xxx_preprocessing.c:10184: error: undefined reference to 'cexp' /Users/fer662/projects/xxx/jni/xxx_preprocessing.c:10184: error: undefined reference to 'cpowf' /Users/fer662/projects/xxx/jni/xxx_preprocessing.c:10285: error: undefined reference to 'cabs'
Now I understand these normally come from linking with libm.so (-lm), but i'm doing that already. If I go and check the offending so with nm:
nm -g /Users/fer662/Library/Android/sdk/ndk-bundle/platforms/android-22/arch-x86/usr/lib/libm.so | grep cpow
Nothing comes back. It DOES hoever, if I use api 28
Also, in the static library it does show, even on api 22:
nm -g /Users/fer662/Library/Android/sdk/ndk-bundle/platforms/android-22/arch-x86/usr/lib/libm.a | grep cpow
s_cpow.o:
00000000 T cpow
s_cpowf.o:
00000000 T cpowf
s_cpowl.o:
00000000 T cpowl
The inconsistency is puzzling. Shouldn't it be missing from the header altogether if not supported? Why does the static lib have it and the dylib not?
Would it make sense to statically link against it? And if so, how would I do it, taking into account the right path for the current api version?
My other option seems to go steal an implementation of libm (say http://openlibm.org/) or just these 3 functions I'm using from it.
c - What functions is the libm intended for?
As far as I know some math functions are contained in libc, while others are in libm. I've discovered that experimentally:
Is there a requirement concerning which mathematical functions must be provided by libm? Does libc and libm together provide all the math functions required by C standard?
c - 带有 glibc / libm 和 float32 的 atan2 的错误结果
我目前正在为涉及许多困难数学运算的医疗设备开发固件。目标处理器支持硬件中的浮点运算,但仅支持float32
(aka single
)。
为了模拟行为并证明我的公式和代码的正确性,我已将固件的相关/数学部分移植到 Linux 中的 GCC 工具链(gcc 6.3.0,libc6 2.24),仔细检查float32
无处不在,并且没有使用会降低数学运算的精度或标准兼容性的编译器开关;值得注意的是,没有任何一个-ffast-math
或它的朋友。
现在,事实证明,对于一小组输入参数,我得到了意想不到的结果。我已经找到了这个问题,并得出结论,为(准确地说:)为一组非常小的输入参数libm
计算了错误的结果。arctan
atan2
例如,如果我有
f_Temp
被计算为46.9755516f
,正确的结果在哪里46.975548972f
。
请注意,我一般都知道不同浮点数据类型、舍入错误等问题。
然而,我的感觉是,即使考虑到 的低精度,上面显示的误差也太高了一个数量级float32
,不幸的是,对于接下来的计算,这个误差太大了。
此外,只有很小的atan2
函数可能输入参数子集受到问题的影响。
任何人都可以简单地解释一下这是一个错误,libm
还是仅仅是由于计算的不精确float32
和需要大量的顺序操作atan2
?
rounding - jq:错误:round/0 未定义在
jq 中的 round 函数不起作用。
我需要做什么?
ubuntu - 如何构建 glibc 包的数学库?
我已经知道如何在旧版本(例如 2.19)旁边构建新版本的 Glibc(例如 2.3)。我按照中的说明进行操作https://www.tldp.org/HOWTO/html_single/Glibc-Install-HOWTO/
而是在 Glibc 中编译整个库,我只想构建数学库(libm.so)。
我如何只能在 ubuntu 中重新编译 libm.so?
第二个问题是可以使用 clang 编译器在 glibc 中重新编译该特定部分(数学)吗?我发现由于标准合规等原因,我无法使用 clang 重新编译整个 Glibc。
c - 如何比较两个数学库实现?
如您所知,C 标准库定义了几个标准函数调用,应该由任何兼容的实现来实现,例如 Newlib、MUSL、GLIBC ...
例如,如果我以 Linux 为目标,我必须在 glibc 和 MUSL 之间进行选择,而我的标准是数学库的准确性libm
。例如,我如何比较两种可能的sin()
实现cos()
?
一种天真的方法是使用参考输入(例如来自 Matlab)在一组随机生成的输入上测试两种实现结果的输出质量,但是还有其他更可靠/正式/结构化/引导的方法来比较/两个模型?我试图看看在这个方向上是否有任何研究,但我发现了,所以任何指针都值得赞赏。
cmake - 使用 CMake 获取、构建和链接 SDL2 失败,并带有未定义的“地板”引用
当我将程序与 SDL2 链接时出现以下错误
我制作了一个包含的 FetchSDL2.cmake 文件,理论上应该得到它并构建和使用它:
但我不断收到上面的错误。我确实有 LibM,并且所有其他数学函数都正确链接。我在 Ubuntu 20.04 上。
你能帮忙解决这个问题,让它正确获取 SDL2 吗?我不安装它的原因是这个脚本将被 CMake 在一些没有包管理器的平台上使用。
c - 我应该如何获得浮点值的小数部分?
我有一个x
type变量float
,我需要它的小数部分。我知道我可以得到它
x - floorf(x)
, 或者fmodf(x, 1.0f)
我的问题:其中一个总是比另一个更可取吗?它们实际上是一样的吗?我可以考虑第三种选择吗?
笔记:
- 如果答案取决于我使用的处理器,让我们将其设为 x86_64,如果您可以详细说明其他处理器,那会很好。
- 请确保并参考
x
. 我不介意这种或那种行为,但我需要知道这种行为是什么。
c++ - 静态链接 libm 以在多台计算机上获得相同的结果
我有一个包含数千个 LOC 的数字 C++ 模型,它在不同的机器上输出不同的结果,我想完全理解为什么会这样。这些差异从第 14 位有效数字开始,但随后传播产生完全不同的结果。
我在这上面花了很多天,终于到了这一点:当我在我的机器上构建它并将它复制到机器 B 时,如果我通过编译它,我可以在两台机器上得到完全相同的结果
所以这已经很棒了。但我想更具体地知道是什么导致了这些差异。所以我检查了哪些库可能是罪魁祸首:
所以我的想法是,理想情况下我会找到一个库来改变它,然后考虑这个库的哪一部分,以及我是否可以对此做点什么。
仅静态链接单个库可用于,例如libgcc
:
但结果仍然不同。所以不是这样。现在的问题是,我似乎无法链接libc
或libm
静态:
所以我想知道,为什么我不能这样做?我的意思是,当我用-DCMAKE_EXE_LINKER_FLAGS="-static" -DCMAKE_FIND_LIBRARY_SUFFIXES=".a"
标志编译它时,它显然是静态链接的。那么为什么这不起作用呢?
我希望我把我的问题说清楚了。任何指针都非常感谢!