Algorithm 在哪里可以找到标准数学函数的算法?
我希望向D编程语言标准库提交一个补丁,允许在编译时使用该语言的编译时函数求值工具对std.math进行求值。编译时函数评估有几个限制,最重要的是:Algorithm 在哪里可以找到标准数学函数的算法?,algorithm,math,reference,d,standard-library,Algorithm,Math,Reference,D,Standard Library,我希望向D编程语言标准库提交一个补丁,允许在编译时使用该语言的编译时函数求值工具对std.math进行求值。编译时函数评估有几个限制,最重要的是: 你不能使用汇编语言 不能调用C代码或源代码不可用的代码 有几个std.math函数违反了这些规则,需要编写编译时版本。我在哪里可以得到关于计算对数、指数、幂和三角函数的好算法的信息?与实际代码相比,我更喜欢算法的高级描述,原因有两个: 为了避免法律上的含糊不清,以及需要使我的代码看起来与源代码“足够不同”,以确保我拥有版权 我想要简单的、可移植的算法
几个来源,包括: Abramowitz和Stegun,“数学函数手册”(可用!) 哈特,“计算机近似”(绝版但良好)
还可以看到其他几个关于三角学的问题,包括“和”。我推荐的资料来源是R.W.Hamming的《科学家和工程师的数值方法》
这本书由多佛出版社出版,是一本便宜的平装书。让·米歇尔·穆勒的书是一本很好的推荐书,哈特也是 你真的有必要拥有版权吗?如果可以避免的话,那么从事编写数学库函数的工作通常是一个坏主意(我以专业人士的身份这么说)。我不知道D是否可以接受BSD许可的代码,但是有几个好的开源实现可能会被证明是有用的。例如,你可能想看看Sun的。Stephen Moshier的也有可能,尽管它的许可情况有点奇怪,但我相信他过去一直愿意让人们在其他许可下重新发布他的代码 另一方面,除非您支持任意精度浮点(我认为D不支持),否则通常不会有libm函数的“渐近效率”概念。John Hart Computer Approximations 1968,作者:John Wiley&Sons 理想情况下,计算结果应该与运行时的计算结果精确匹配。这可能很棘手。对于许多函数,没有级数在整个域上快速收敛,因此算法将各种方法粘贴在一起
此外,还有各种浮点格式。大多数平台(我认为)现在使用IEEE 754。1985年,当我编写编译器时,我不得不处理跨平台浮点格式。这是非常乏味的,因为你必须一点一点地把数字拼凑在一起,确保你精确地得到目标机器上要计算的值。我不知道您是否必须处理这个问题。正如您所料,其他语言中也会出现类似的问题: 帮助确保Java的可移植性 程序,一些 此包中的数值函数 要求他们生产同样的产品 已公布的结果 算法。这些算法是 可从知名网络获取 库netlib作为包“免费” 可分发数学库,“fdlibm。 这些算法是用 然后介绍了C编程语言 被理解为与所有 浮点运算 Java浮点规则 算术 我不知道D的规则对于数学函数的运行时计算是什么,但您可能可以使用类似的技巧——将fdlibm的C源代码重新解释为D。如果D调用特定于平台的C库,那么您就有一个问题,即在编译时可能无法预测运行时值
我认为fdlibm的许可证非常宽松,你必须自己检查它是否适合在d中重新分发。我看到的一个版本要求保留版权声明,就是这样。CORDIC不适合高级算法,它更适合乘法昂贵的嵌入式/数字系统。嗯,我不会说CORDIC不合适。是的,如果乘法便宜的话,可能会有更快的算法(正如维基百科文章所指出的)。dsimcha要求使用“简单”算法,并不“关心微观优化”。hmmm——看起来很适合函数近似的一般理论。但是在阅读目录时,他们似乎没有讨论具体的功能。大多数函数,如果在有限范围内计算,不难计算。但是在整个
double
输入范围内,exp()和log()以及sqrt()的实现并不简单。(sin/cos/tan可以使用范围缩减)然后进入erf、gamma和bessel函数以及其他内容。+1表示编译时应该与运行时匹配。编译器编写人员很快就会忘记的东西。如果可以的话,我会投20票。从一个不那么积极的方面来说,你指的是IEEE-754。488是HP接口总线iirc的标准配置。谢谢。我将编辑评论。IEEE 488是一种完全不同的动物。