我必须使用静态验证C源的一些(半)自动验证软件(CBMC (链接)).支持浮点,但没有所有数学函数的定义.尝试检查是否可以用它来检查数字软件.
所以我需要这些功能.我在找一些math.h没有协处理器使用的定义(例如sqrt,pow,其余部分tan; int/ float/ double).
当我在一些Linux发行版附带的libc(也许现在是eglibc)中查找它时,我总是达到一个点,其中有一些处理器内在函数意味着硬件sqrt函数.
我需要的是一个支持数学函数的库,具有以下特征:
到目前为止,我搜索了各种libc实现,特别是有关嵌入式系统的实现.我认为这些库中的大多数都是针对编译程序的可移植性和大小,但很难说它们是否使用特定于处理器的指令.
有人能给我一些关于这些数学库结构的简短介绍.他们如何调度各种版本(例如特定的协处理器)?
这些不同前缀在文件名中的含义是什么?e_sqrt.c,k_sin,s_sin?
我会很高兴听到一些图书馆这可能是对我有用.我宁愿选择一个库,但是当它有必要时,也可以寻找一些单一的函数实现并构建一个小型库.我不会使用math.h中定义的所有函数.
这个和这个 SO帖子都说Java Math Implementation是基于fdlibm的,这听起来这个库是可行的.有关这个库的更多信息的人我应该知道吗?
似乎我有很多可能性,包括以下两个:
我尝试计算双精度浮点值的反正切,该值保存在 xmm 寄存器中。对于正常的浮点,可以使用旧的 x87 指令 FPATAN,但是如何使用 double 来做到这一点?
我一直在为我为 Discord Bot 制作的模块编写代码。我一直在尝试不使用任何模块,因为它对导入东西没有帮助。所以我想我应该自己为他们两个写代码。
这里的问题是我真的不知道我们如何制作它们。我在网络上的任何地方都找不到它们,因为到处都只看到使用了math我不想使用的模块。
我不知道如何与他们合作,所以我需要一些帮助。
谢谢你!:)
我刚检查过它numpy的sine功能.显然,它会在pi周围产生非常不准确的结果.
In [26]: import numpy as np
In [27]: np.sin(np.pi)
Out[27]: 1.2246467991473532e-16
Run Code Online (Sandbox Code Playgroud)
预期的结果是0.为什么numpy那么不准确?
在某种程度上,我不确定将计算结果视为不准确是否可接受:它的绝对误差在一个机器epsilon(对于binary64)内,而相对误差是+inf- 我觉得有些困惑的原因.任何的想法?
[编辑]我完全理解浮点计算可能不准确.但是大多数浮点库可以设法在一小部分误差范围内提供结果.这里,相对误差是+ inf,这似乎是不可接受的.想象一下,我们想要计算
1/(1e-16 + sin(pi))
Run Code Online (Sandbox Code Playgroud)
如果我们使用numpy的实现,结果将是灾难性的错误.