不幸的是,没有一种方法能够在大量特殊函数中实现健壮、准确和高性能的实现。通常,输入域的不同部分必须使用两种或两种以上的方法,基本函数的必要研究和实现工作可能需要数周时间,而更高级的超越函数可能需要数月时间。
由于生成高质量的实现需要相当的数学和编程技能,我的第一个建议是尽可能利用现有的数学库。这些可能是商业图书馆,例如NAG数字库或RogueWave的IMSL数字库,或开源库,如GNU科学图书馆(GSL)或Boost库的数学和数学部分。您还可以在在线存储库中找到相关的源代码,例如Netlib从ACM TOMS收集的算法.
实际上,在现代SIMD增强型处理器上,广泛使用表格已不再可取,(分段)多项式近似通常是最有吸引力的。基于表的方法在高性能处理器体系结构中不受欢迎的原因是,在过去十年中,功能单元的性能(以FLOPS衡量)的增长速度远远快于内存子系统的性能(用GB/秒衡量)。以下论文中的推理与我自己的专业经验相符:
Marat Dukhan和Richard Vuduc,“初等函数的高通量计算方法”。在并行处理与应用数学,第86-95页。斯普林格,2014年。(幻灯片)
就性能而言,多项式近似受益于现代处理器硬件(CPU和GPU)中存在的融合乘加运算(FMA)。此操作还有助于减少舍入错误,同时提供一些针对减法消除的保护。为了获得最小的误差和最佳的效率,人们希望使用极小极大近似.
常用工具,如枫树和数学软件具有生成这些内容的内置工具。虽然它们生成的近似值在数学意义上是(非常接近)最优的,但它们通常不会考虑系数表示和以有限的浮点精度计算操作所产生的错误。这个索利娅工具通过其fpminimax最大值
命令。最后,您可以编写自己的近似代码,它可能基于Remez算法.
对于某些函数,多项式近似并不实用,因为要达到IEEE-754的双精度需要太多的项。在这种情况下,可以从两种策略中选择一种。
第一种策略是使用基本算术和简单的初等函数巧妙地转换输入参数,从而使生成的函数在多项式近似方面“表现良好”。通常,这种变换倾向于“线性化”待逼近的函数。这种方法的一个很好的教学示例是计算电流变液控制
在以下论文中:
M.M.Shepherd和J.G.Laframboise,“切比雪夫近似$(1+2x)\exp(x^2)\operatorname{erfc}x$在里面$0\leqsleat x美元<\英菲$".计算数学第36卷,第153号(1981年1月),第249-253页(在线)
第二种方法是使用两个多项式的比值,即有理逼近,例如以Padé近似值。前面提到的工具可以帮助实现这一点;也有大量关于有理逼近的文献发表,一般来说,有理逼近比多项式逼近更难解决。
对于特殊函数(与初等函数相反),简单的多项式和有理逼近通常不准确和/或效率低下。它们需要应用更高级的数学概念,如渐近展开式、递推关系和连分式展开式。即使使用这些方法从数学上解决了问题,也可能存在数值问题,例如,在向前计算连续分数时。毫不奇怪,整本书都是关于某些函数的计算机求值的,例如贝塞尔函数和马修函数。
在下面,我将快速概述有用的文献,从数学基础的涵盖范围开始,转到适用于初等函数和简单特殊函数的方法,例如电流变液控制
和特加玛
最后是针对在性能和精度方面都难以计算的特殊函数的高级方法。显然,这只能触及表面,关于特定功能的许多相关材料可以在个别论文中找到,例如AMS、SIAM、ACM和IEEE的期刊和论文集。
许多文献尚未赶上现代硬件和软件环境,特别是FMA操作和SIMD体系结构的存在。就用于评估数学函数的稳健计算机代码而言,一方面,人们可以希望数学和科学之间,另一方面,计算机科学和计算机工程之间进行更密切的合作。在下面的作品中,马克斯坦和穆勒的作品是这方面最先进的。
Milton Abramowitz和Irene A.Stegun(编辑),“数学函数手册。公式、图形和数学表”。纽约州纽约市:多佛1972(在线版本)
Frank Olver等人(编辑),“NIST数学函数手册”。纽约州纽约市:剑桥大学出版社2010(在线版本)
A.Erdelyi等人,《高等超越功能》,第1-3卷。纽约州纽约市:McGraw-Hill 1955
奥斯卡·佩伦(Oskar Perron),“Die Lehre von den Kettenbrüchen,第三版”,第1+2卷。斯图加特(德国):1954年、1957年
John F.Hart,“计算机近似”。佛罗里达州马拉巴尔:克里格出版社,1978年
William J.Cody和William Waite,《基本功能软件手册》。新泽西州恩格尔伍德克利夫斯:普伦蒂斯·霍尔1980
Peter Markstein,“IA-64和基本函数”。新泽西州上鞍河:普伦蒂斯·霍尔2000
Jean-Michel-Muller,“基本函数.算法和实现第三版”。2016年Birkhä用户
Nelson H.F.Beebe,《数学函数计算手册》。施普林格2017
Jean-Michel-Muller等人,《浮点运算手册》第二版。2018年Birkhä用户
Nico M.Temme,“特殊函数。数学物理经典函数简介”。纽约州纽约市:Wiley 1996
Amparo Gil、Javier Segura和Nico M.Temme,“特殊函数的数值方法”。SIAM 2007年
Frank W.J.Olver,“渐近与特殊函数”。马萨诸塞州纳蒂克:A K Peters 1997
Jet Wimp,“递归关系计算”。马萨诸塞州波士顿:皮特曼1984
A.N.Khovanskii,“连分式及其推广在近似理论中的应用”。格罗宁根(荷兰):1963年诺德霍夫
A.Cuyt等人,《特殊函数连分式手册》。施普林格2008