是否有软件可以从符号公式自动生成数值精确的浮点 C 例程?

计算科学 软件 浮点 准确性
2021-11-24 20:53:08

给定实变量的实函数,是否有可用的软件可以自动生成数字精确的代码来计算配备 IEEE 754 算法的机器上所有输入的函数?

例如,如果要评估的实际功能是:

f(a, b, c) = \frac{-b - \sqrt{b^2 - 4ac}}{2a}

该软件将考虑灾难性取消,并可能针对某些输入集进行输出表查找,以避免计算准确性的损失。

或者,是否有软件可以生成纯基于表的查找例程来高精度计算给定函数?

4个回答

我所知道的最佳解决方案是在MathematicaMapleSymPy中编写符号表达式;所有链接都直接指向代码生成文档。以上所有程序都可以生成 C 或 Fortran 代码。

上述程序均未提及 IEEE 754 算术的准确性;正如@dmckee 所指出的,一般来说,很难预测灾难性取消的所有来源。在数值分析中很难取代人类的专业知识。

为了提供一个具体的例子,考虑计算三角函数到高精度的任意输入[0,2π]. 这样做有很多策略,有些甚至依赖于硬件,如 Wikipedia 文章Trigonometric Tables中所示。所有算法都需要独创性和数值分析,即使是依赖于查找表和泰勒级数或插值的算法(参见维基百科文章制表者的困境)。有关更多详细信息,请参阅相关的堆栈溢出问题三角函数如何工作?.

生成代码或例程以高精度计算任意函数的软件不仅需要了解取消错误,还需要了解用于计算未定义的函数的级数近似值有限数量的加法、减法、乘法、除法和位移。(参见近似理论。)

如果您想知道我们离这样的软件包还有多远,请查看 2001 LAPACK 工作说明,关于可靠有效地计算 Givens 旋转我希望数值分析领域的大多数非专业人士(以及许多专家!)都会惊讶于在解决这样一个表面上简单的问题时需要进行多少分析:

给定f,gC, 寻找cRsC这样

R(c,s)[fg]=[css¯c][fg]=[r0]
,

在哪里R(c,s)是单一的。平衡可靠性与计算效率以及更微妙的问题(如连续性)是非常重要的,并且在可预见的未来不太可能实现自动化。

数学表达式的代码生成和预编译正变得越来越流行。

虽然 SymPy、Mathematica 和 Maple 等符号包可能包含代码生成,但我不相信它们中的任何一个也会认真考虑数字。

还有一些其他项目可以研究,它们对符号和数字都感兴趣。

Theano就是这样一个专注于数组操作的项目。它们确实识别并替换了一些已知的数字病态操作。我不确定这是否包括您的具体情况,但值得研究。

螺旋可能对你也很有趣。他们还预编译了一个抽象语法树,并注意数字问题。他们更关心标量运算(例如您的示例)。然而,它们也相当专业于特定领域。

然而,这一领域的增长令人鼓舞。人们可以乐观地认为,您的问题将在几年内得到更好的答案。

一般来说,我可以肯定地说 SymPy 中代码生成器的实现者甚至没有尝试过 =P。

Paolo Bientinesi 开发了一种生成线性代数算法稳定性证明的方法,该算法是使用 Robert van de Geijn 的 FLAME 表示法生成的。

请参阅本文更长的工作说明版本