给定实变量的实函数,是否有可用的软件能够自动生成数字精确代码,以在配备IEEE 754算法的机器上对所有输入进行函数计算?
例如,如果要评估的实函数为:
该软件将考虑灾难性的取消操作,并可能考虑对某些输入集进行输出表查找,以避免计算精度下降。
或者,是否存在可以生成基于纯表的查找例程以高精度计算给定函数的软件?
给定实变量的实函数,是否有可用的软件能够自动生成数字精确代码,以在配备IEEE 754算法的机器上对所有输入进行函数计算?
例如,如果要评估的实函数为:
该软件将考虑灾难性的取消操作,并可能考虑对某些输入集进行输出表查找,以避免计算精度下降。
或者,是否存在可以生成基于纯表的查找例程以高精度计算给定函数的软件?
Answers:
我所知道的最好的解决方案是用Mathematica,Maple或SymPy对符号表达式进行编程;所有链接都直接转到代码生成文档。上面的所有程序都可以用C或Fortran生成代码。
以上程序均未提及IEEE 754算术中的准确性。通常,很难预测到所有灾难性取消的来源,如@dmckee所述。很难取代数值分析中的人类专业知识。
为了提供一个具体的例子,可以考虑在计算三角函数高精度对于任意输入。这样做的策略很多,甚至取决于硬件,如Wikipedia文章Trigonometric Tables所示。所有算法都需要独创性和数值分析,甚至需要依赖于查找表和泰勒级数或插值的算法(请参阅Wikipedia文章The Table-Maker's Dilemma)。有关更多详细信息,请参见相关的堆栈溢出问题。三角函数如何工作?。
生成代码或例程以高精度计算任意函数的软件,不仅需要了解消除误差,而且还需要序列近似值(Taylor,Padé,Chebyshev,有理数等)来计算未按以下方式定义的函数有限数量的加法,减法,乘法,除法和移位。(请参阅近似理论。)
如果您想知道我们离这样一个软件包有多远,请查看2001 LAPACK关于可靠,高效地计算Givens旋转的工作说明。我希望数值分析的大多数非专家(和很多专家!)会对解决这种表面上简单的问题进行了多少分析而感到惊讶:
鉴于,找到Ç ∈ [R和š ∈ Ç使得
代码生成和数学表达式的预编译正变得越来越流行。
尽管诸如SymPy,Mathematica和Maple之类的符号包可能包含代码生成,但我不确定它们中的任何一个也对数字进行认真考虑。
还有其他一些项目可能会对符号和数字感兴趣。
Theano是一个围绕阵列操作的项目。它们确实标识并替换了一些已知为数字病态的操作。我不确定这是否包括您的具体情况,但值得研究。
螺旋可能对您也很有趣。他们还预编译了抽象语法树,并注意数字问题。他们更关注标量运算(例如您的示例)。但是,它们也相当特定于特定领域。
但是,这一领域的增长令人鼓舞。可以乐观地说,您的问题将在几年内得到更好的回答。