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


25

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

例如,如果要评估的实函数为:

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

该软件将考虑灾难性的取消操作,并可能考虑对某些输入集进行输出表查找,以避免计算精度下降。

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


5
难题一般。
dmckee 2011年

1
如果问题特别是关于多项式的根计算(或因式分解),那么那里有一些C(或C ++)库。
moala 2011年

2
您可能想查看ACCU杂志《超载》中Richard Harris的精彩文章,内容涉及The Floating Point Blues。我在Programmers.SX上为可能感兴趣的人建立了索引
Mark Booth 2012年

Answers:


25

我所知道的最好的解决方案是用MathematicaMapleSymPy对符号表达式进行编程;所有链接都直接转到代码生成文档。上面的所有程序都可以用C或Fortran生成代码。

以上程序均未提及IEEE 754算术中的准确性。通常,很难预测到所有灾难性取消的来源,如@dmckee所述。很难取代数值分析中的人类专业知识。

为了提供一个具体的例子,可以考虑在计算三角函数高精度对于任意输入。这样做的策略很多,甚至取决于硬件,如Wikipedia文章Trigonometric Tables所示。所有算法都需要独创性和数值分析,甚至需要依赖于查找表和泰勒级数或插值的算法(请参阅Wikipedia文章The Table-Maker's Dilemma)。有关更多详细信息,请参见相关的堆栈溢出问题。三角函数如何工作?[0,2π]

生成代码或例程以高精度计算任意函数的软件,不仅需要了解消除误差,而且还需要序列近似值(Taylor,Padé,Chebyshev,有理数等)来计算未按以下方式定义的函数有限数量的加法,减法,乘法,除法和移位。(请参阅近似理论。)


4
“很难取代数字分析中的人类专业知识。” -仅此一项就应+1。
JM

“很难”与“不可能”不是一回事。对于某些工作(例如编译器编写者),存在“充分就业定理”。数值分析师有一个吗?
别名


14

如果您想知道我们离这样一个软件包有多远,请查看2001 LAPACK关于可靠,高效地计算Givens旋转的工作说明。我希望数值分析的大多数非专家(和很多专家!)会对解决这种表面上简单的问题进行了多少分析而感到惊讶:

鉴于,找到Ç [Rš Ç使得f,gCcRsC

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

R(c,s)


1
+1这是一个很好的例子,谢谢。我想如果存在实数的解决方案,那么它可能适用于复数。
丹尼尔·特雷比恩

我可能应该提到,根本的困难不是s可能很复杂,而是避免不必要的上溢和/或下溢。它与hypot函数有关:en.wikipedia.org/wiki/Hypot
Jack Poulson

11

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

尽管诸如SymPy,Mathematica和Maple之类的符号包可能包含代码生成,但我不确定它们中的任何一个也对数字进行认真考虑。

还有其他一些项目可能会对符号和数字感兴趣。

Theano是一个围绕阵列操作的项目。它们确实标识并替换了一些已知为数字病态的操作。我不确定这是否包括您的具体情况,但值得研究。

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

但是,这一领域的增长令人鼓舞。可以乐观地说,您的问题将在几年内得到更好的回答。


2
同意 也许我的回答太悲观了,因为有很多针对特定领域的解决方案,但总的问题是...很难。
杰克·普尔森

4

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

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

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


1

Sage使您可以用Cython(生成C代码的python变体)表达公式;但是,回答您的更普遍的问题:不。考虑莱斯定理

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.