27

我希望向 D 编程语言标准库提交一个补丁,该补丁将允许使用该语言的编译时函数评估工具在编译时评估大部分 std.math。编译时函数评估有几个限制,最重要的是:

  1. 你不能使用汇编语言。
  2. 您不能调用 C 代码或源代码不可用的代码。

几个 std.math 函数违反了这些,需要编写编译时版本。我在哪里可以获得有关计算对数、指数、幂和三角函数等事物的良好算法的信息?我更喜欢算法的高级描述而不是实际代码,原因有两个:

  1. 为了避免法律上的歧义和需要使我的代码看起来与源代码“足够不同”以确保我拥有版权。

  2. 我想要简单、可移植的算法。我不关心微优化,只要它们至少是渐近有效的。

编辑:D的编译时函数评估模型允许在编译时计算的浮点结果与在运行时计算的结果不同,所以我不在乎我的编译时算法是否给出与运行时版本完全相同的结果只要它们在实际显着程度上不那么准确。

4

7 回答 7

17

John Wiley & Sons 于 1968 年出版的John Hart Computer Approximations 。

理想情况下,计算应该与在运行时完成的精确匹配。这可能很棘手。对于许多函数,没有级数在整个域上快速收敛,因此算法将各种方法粘贴在一起。

此外,还有各种浮点格式。大多数平台(我认为)现在都使用 IEEE 754。当我编写编译器时,ca. 1985 年,我不得不处理跨平台的浮点格式。把它做对是非常乏味的,因为你必须一点一点地把数字拼凑在一起,确保你得到的值是在目标机器上计算出来的。我不知道你是否需要处理这个问题。

于 2010-01-30T22:39:38.907 回答
8

让-米歇尔·穆勒 (Jean-Michel Muller) 和哈特 (Hart) 的书是极好的推荐。

你真的有必要拥有版权吗?如果可以避免的话,进入编写数学库函数的业务通常是一个坏主意(我说这是一个专业的人)。我不知道 D 是否可以接受 BSD 许可的代码,但是有几个很好的开源实现可能会很有帮助。例如,您可能想查看 Sun 的FDLIBM。Stephen Moshier 的Cephes也是一种可能性,尽管它的许可情况有点奇怪,但我相信他过去一直愿意让人们在其他许可下重新分发他的代码。

附带说明一下,除非您支持任意精度的浮点数(我认为 D 不支持),否则 libm 函数通常没有“渐近效率”的概念。

于 2010-01-30T22:36:36.667 回答
4

我推荐的来源是RW Hamming 为科学家和工程师提供的数值方法。

这本书由多佛出版社出版,是一本廉价的平装本。

于 2010-01-30T22:25:28.900 回答
4

如您所料,其他语言也会出现类似问题:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StrictMath.html

为帮助确保 Java 程序的可移植性,此包中某些数值函数的定义要求它们产生与某些已发布算法相同的结果。这些算法可从著名的网络库 netlib 中以包“Freely Distributable Math Library”fdlibm 的形式获得。这些算法是用 C 编程语言编写的,因此可以理解为按照 Java 浮点运算规则执行所有浮点运算。

我不知道 D 对数学函数的运行时计算的规则是什么,但你也许可以采用类似的技巧 - 将 fdlibm 的 C 源重新解释为 D。如果 D 调用特定于平台的 C 库,那么你有在编译时可能无法预测运行时值的问题。

我认为 fdlibm 的许可证非常宽松,您必须自己检查它是否适合在 D 中重新分发。我见过的一个版本需要保留版权声明,仅此而已。

于 2010-01-31T00:50:28.003 回答
3

请参阅Jean-Michel Muller所著的“基本函数:算法与实现”一书。

于 2010-01-30T22:16:14.390 回答
2

也许这对您有帮助(至少对于某些功能): http ://en.wikipedia.org/wiki/CORDIC

于 2010-01-30T22:19:35.193 回答
2

几个来源,包括:

Abramowitz 和 Stegun,“数学函数手册”(可在线获取!)

哈特,“计算机近似”(绝版但很好)

另请参阅有关三角学的其他几个 SO 问题,包括“三角函数如何工作? ”和“嵌入式系统上的三角函数”。

于 2010-01-30T22:19:40.690 回答