我希望向D编程语言标准库提交一个补丁,它将允许使用该语言的编译时功能评估工具在编译时评估大部分std.math。编译时功能评估有几个局限性,最重要的是:
有几个std.math函数违反了这些函数,需要编写编译时版本。我在哪里可以获得有关计算诸如对数,指数,幂和三角函数等优良算法的信息?我更喜欢算法的高级描述和实际代码,原因有两个:
为了避免法律含糊不清,需要让我的代码与来源看起来“不同”,以确保我拥有版权。
我想要简单,便携的算法。我不关心微优化,只要它们至少是渐近有效的。
编辑:D的编译时函数评估模型允许在编译时计算的浮点结果与运行时计算的浮点结果不同,所以我不在乎我的编译时算法是否给出完全与运行时版本相同的结果,只要它们在实际上并不那么精确。
答案 0 :(得分:17)
理想情况下,计算应该与运行时完成的计算完全匹配。这可能很棘手。对于许多函数,没有一个序列在整个域上快速收敛,因此算法将各种方法粘贴在一起。
此外,还有各种浮点格式。大多数平台(我认为)现在都使用IEEE 754.当我编写一个编译器时。 1985年,我不得不处理跨平台浮点格式。要把它弄好是非常繁琐的,因为你必须一点一点地将数字拼凑在一起,确保你准确得到在目标机器上计算的值。我不知道你是否必须处理这件事。
答案 1 :(得分:8)
Jean-Michel Muller的书是一个很好的推荐,哈特也是如此。
您是否真的有必要拥有版权?如果你可以避免它,那么进入编写数学库函数的业务通常是一个坏主意(我说那是专业人士)。我不知道D是否可以接受BSD许可的代码,但是有一些很好的开源实现可能会有所帮助。例如,您可能希望查看Sun的FDLIBM。 Stephen Moshier的Cephes也是可能的,虽然它的授权情况有点奇怪,但我相信他一直愿意让人们在其他许可证下重新分发他的代码。
在旁注中,除非你支持任意精度浮点(我不认为D的确如此),否则libm函数通常没有“渐近效率”的概念。
答案 2 :(得分:4)
我推荐的来源是R. W. Hamming的科学家和工程师的数值方法。
这本书由Dover Press出版,是一本廉价的平装本。
答案 3 :(得分:4)
正如您所期望的那样,其他语言也会出现类似的问题:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StrictMath.html
帮助确保Java的可移植性 程序,一些的定义 此包中的数字函数 要求他们生产相同的产品 结果一定公布 算法。这些算法是 可从知名网络获得 库netlib作为包“自由地 可分发的数学库,“fdlibm。 这些算法,写在 那么C编程语言就是 被理解为与所有人一起执行 以下是浮点运算 Java浮点规则 算术。
我不知道数学函数的运行时计算的D规则是什么,但是你可能会得到类似的技巧 - 将fdlibm的C源重新解释为D.如果D调用特定于平台的C库,那么你就会遇到一个问题,即在编译时可能无法预测运行时值。
我认为fdlibm的许可是非常宽松的,你必须自己检查它是否适合在D中重新分发。我看到的一个版本需要保留版权声明,就是这样。
答案 4 :(得分:3)
请参阅书籍"Elementary Functions: Algorithms and Implementation" 作者:Jean-Michel Muller。
答案 5 :(得分:2)
也许这有助于你(至少对某些功能而言): http://en.wikipedia.org/wiki/CORDIC
答案 6 :(得分:2)
有几个来源,包括:
Abramowitz和Stegun,“数学函数手册”(可用online!)
Hart,“计算机近似”(绝版但很好)
还可以看到关于三角学的其他几个SO问题,包括“How do Trigonometric Functions Work?”和“Trigonometric Functions on Embedded Systems”。
答案 7 :(得分:1)
有关一些特殊功能和随机数生成的代码链接,请参阅Stand-alone code for numerical computing。那里的所有代码都是公共领域。代码用C ++和Python实现,但很容易翻译成任何其他语言。