Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在哪里可以找到标准数学函数的算法?_Algorithm_Math_Reference_D_Standard Library - Fatal编程技术网

Algorithm 在哪里可以找到标准数学函数的算法?

Algorithm 在哪里可以找到标准数学函数的算法?,algorithm,math,reference,d,standard-library,Algorithm,Math,Reference,D,Standard Library,我希望向D编程语言标准库提交一个补丁,允许在编译时使用该语言的编译时函数求值工具对std.math进行求值。编译时函数评估有几个限制,最重要的是: 你不能使用汇编语言 不能调用C代码或源代码不可用的代码 有几个std.math函数违反了这些规则,需要编写编译时版本。我在哪里可以得到关于计算对数、指数、幂和三角函数的好算法的信息?与实际代码相比,我更喜欢算法的高级描述,原因有两个: 为了避免法律上的含糊不清,以及需要使我的代码看起来与源代码“足够不同”,以确保我拥有版权 我想要简单的、可移植的算法

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

  • 你不能使用汇编语言
  • 不能调用C代码或源代码不可用的代码
  • 有几个std.math函数违反了这些规则,需要编写编译时版本。我在哪里可以得到关于计算对数、指数、幂和三角函数的好算法的信息?与实际代码相比,我更喜欢算法的高级描述,原因有两个:

  • 为了避免法律上的含糊不清,以及需要使我的代码看起来与源代码“足够不同”,以确保我拥有版权

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

  • Edit:D的编译时函数求值模型允许编译时计算的浮点结果与运行时计算的浮点结果不同,因此,我不在乎我的编译时算法是否不能给出与运行时版本完全相同的结果,只要它们的准确度不低于实际显著程度。

    参见本书 Jean-Michel Muller所著。

    也许这对您有所帮助(至少在某些功能方面):

    几个来源,包括:

    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是一种完全不同的动物。