,或计算速度更快?


10

其计算速度更快,ablogaccbabc是正实数,且b>1

您将在比较中使用哪种算法?它们的复杂性是什么?

例如,当cabcab

这个问题的灵感来自对数学堆栈交换问题的评论,斯特林近似于阶乘的目的是什么?。特别是mjqxxxxThomas Andrews和我留下的评论。


主持人显然也可以批准编辑。我同意@MarkBooth的建议,并按照他的建议将其纳入了问题。
阿隆·艾玛迪亚

现在,请整理一下(删除)评论,以达到目的。* 8')
Mark Booth 2012年

Answers:


8

有关某些相关问题,请参见我对这个问题的回答。

通常,计算机只能加,减,乘,除和移位。为了讨论的方便,我们假设你没有计算在特殊情况下一个是2和电源babab是自然数,因为这种情况下,减少位移位,因此是容易的。

如果为自然数,并且要计算一个b,您可以使用除链幂bab。您的问题中的其他所有情况都很难(一般而言)。

一些用于将这些函数逼近到高精度的快速算法需要黑魔法。要了解“黑魔法”的含义,请看Martin Ankerl的这篇博客文章,以及他在Neural Computation中链接到的相关论文。另请参阅CORDIC算法。

Hacker's Delight解释了类似的比特翻转技巧(链接指向该书的配套网站)。

计算良好近似值的其他方法使用数值分析(请参阅Wikipedia的近似理论文章))。一种不好的方法是建立一个适当的微分方程,并使用像欧拉方法那样的数值方法对其进行积分(就像我说的那样,这是一个不好的近似值,但是您可以做到)。更好的方法是使用级数逼近。泰勒级数收敛太慢,因此可以代替使用Padé近似值或其他类型的快速收敛级数逼近(其他有理近似值,Chebyshev序列等)。

用于近似上述功能的算法将取决于您的体系结构,速度要求和精度要求。

谈论复杂性的问题是,任何算法都只会计算您提到的函数的浮点近似值,因此运行时间肯定取决于您对近似值的要求。即使考虑到这一点,我也不认为计算复杂度是性能的一个很好的第一近似值。输入的大小将以位为单位进行度量(即表示bc所需的位数)abc),这将取决于精度,而不是取决于数字输入本身的大小。出于实际目的,数字的数字表示的精度不会有太大变化(单精度,双精度,四精度),并且您通常不会根据标量函数的任何计算复杂性估计来决定使用该精度。最相关的指标是时钟时间,除非您使用的是特殊的体系结构(嵌入式系统),否则您的应用程序确实需要快速的指数(请参见上面的博客文章链接和Neural Computation链接),否则您的内部库选择的语言可能还不错。


4

这是一个问题,因为理解数值算法和性能是成为有效的计算科学家的重要前提。同时,这是一个很糟糕的问题,因为提出的约束条件不足以使它给出有意义的答案。

三种计算的性能将在很大程度上取决于最终结果所需的精度以及表示操作数所需的最低精度。您可以将bc限定为正实数,但是我们还需要知道多少个二进制数字d n才能准确地表示它们。要了解一般实数的性能注意事项,我们首先需要了解计算机如何表示整数以及如何使用浮点数来近似整数。abcdn

当计算机使用整数运算时,所需的二进制位数显然等于整数的对数2,加上用于处理符号的额外位:M2

log 2 | M | + 1dn=2|M|+1

例如,数字-8可以用4个二进制数字表示。为了提高性能和空间效率,算术逻辑单元(ALU)负责对现代处理单元上的整数进行数值计算,旨在处理不超过某个固定大小的整数的数学运算,最近最常见的是d = 32和d = 64。不仅您计算机中的x86处理器具有ALU,它们还是当今电子社会中普遍存在的计算机体系结构的基本组成部分。如果您熟悉视频游戏机,您可能会记得Nintendo 64,这是一个以尺寸(以位为单位)命名的视频游戏系统,其设计旨在处理控制台处理器上的算术逻辑单元。

算术逻辑单元上的整数加法,减法和乘法非常有效,通常只需要几个周期即可计算。除法的性能较差,在现代处理器上可能需要多达几十个周期。性能取决于处理单元的体系结构(以及算术逻辑单元的相应实现)及其频率。请注意,对于x的 1到64之间的任何值,64位处理器通常可以对位操作数执行相同的算术运算。xx

在一般计算中,尤其是在科学计算中,整数数学对于许多计算而言都是笨拙的,并且需要数字的另一种表示形式,即所谓的“浮点”表示形式。浮点数代表了现代微处理器的工作方式(将数据按位块状分割)和通过使用固定基数b(通常为b = 2b = 10),并使用两个整数,一个尾数s(在某些圆圈中为有效数)和一个指数e来表示数字。给定数xnbb=2b=10sex 然后大致表示为:

x=sbe

我说大概是因为很明显,即使是简单的理性,例如不能完全表示为标准基数的浮点数。提交给有效位数的数字位数确定该数字的精度,该精度与其本身的大小有关。在IEEE 754标准指定的行为为浮点数是如何预期数量的规则,其中包括有效数和尾数的范围(以及相应的范围和精度)为几个重要的值dÑ,使数值计算是内重复一些宽容。对于浮点数的工作原理有很多微妙之处,我无法希望在此答案中有所体现。为获得很好的介绍,我建议“每位计算机科学家应了解的浮点算术知识”13dn

在过去的50年中,已经投入了大量的智力努力来提高处理器的能力,以有效地计算算术浮点运算。在现代处理器上,这些计算由一个或多个浮点单元(FPU)处理,这是算术逻辑单元的一种更复杂的版本,旨在对浮点数执行算术运算,通常设计为同时处理IEEE 754指定的32位浮点数(通常称为“浮点数”)和64位浮点数(通常称为“双精度数”)。与算术逻辑单元类似,浮点单元通常可以在几个周期内计算加,减和乘,而除法通常需要更多。

在大多数情况下,IEEE 754 64位浮点“双精度”足以进行数值计算,因此让我们假设bc分别表示为64位双精度,并且您对使用x87浮点指令子集在Intel Nehalem架构上将三个计算作为标量运算,即您不希望在for循环或一系列数据中计算这些运算,并且您不想使用向量扩展。指令等待时间信息是从Agner Fog出色的 Intel / AMD架构指令参考表集中收集的。abc

  1. ab
  2. 记录一个 cac
  3. c1b

1一般取幂通常以以下身份实现:

ab=βalogβb

其中是要么2È(在这种情况下,我使用β = 2)。假设您愿意放弃结果的某些准确性(x87单元以80位精度进行计算,但这对于ab的某些值范围来说是不够的),可以使用FYL2X硬件指令来完成此计算到计算= 一个· 日志2 b和F2XM1硬件指令(有一些帮助的缩放)来计算2 。假设〜20个周期来处理缩放:β2eβ=2abt=alog2b2t

FYL2X + F2XM1 +〜20 = 80 + 51 +〜20 =〜151个周期

2可以通过更改基础身份将其转换为两个对数和一个除法,并且无需重新定标即可获得准确的结果。

2 * FYL2X + FDIV = 2 * 80 +(7至27)= 167至187个周期

[3]这等效于除法后加幂,因此[1]加FDIV,约175个周期。


0

让我看看我是否可以解释这个问题:

案例1:请问比较日志ç ,作为一个接近无穷大(渐进意义上的)?一个b日志一个C一个

答案:这实际上取决于c是否对a依赖,以及a与b的比较方式(大于,小于或等于)。

我将介绍您针对ba之间的关系指定的一些情况:Cb一个

假设1:假设是一个常数,则log ac = ln c / ln a ,它甚至根本没有接近无穷大(接近零)。在这种情况下,记录一个C ^ 是一种渐进下界一个b一个接近无穷大,但它不是一个“紧”渐近界。使用Cormen等人(算法简介,第三版)流行的命名法和符号,a b = ω logC日志一个C=lnC/ln一个日志一个C一个b一个一个b=ω日志一个C

假设2:假设。然后,记录aa b= b。然后,b为常数,而一个b生长而不需要事先结合作为接近无穷大。因此,l o g ac 仍然是渐近下界,但不是紧的下界。因此,a b = ω log ac C=一个b日志一个一个b=bb一个bØG一个C一个b=ω日志一个C

C一个b一个bC=Θ一个b

日志一个CC1个/b

一个bC

CC1个/bbC1个/b=Ø日志一个C

C=一个b日志一个C=一个C1个/b=一个日志一个C=ΘC1个/b

C一个b一个bC

C1个/b一个b

CC1个/b一个bC1个/b=Ø一个b

C=一个bC1个/b=一个b>1个一个bC1个/b

一个bC


我将我的评论分为两部分:风格和内容。从风格上讲,我感谢您在帖子中加入了方程式。请重新格式化它们以使用MathJax,以使其呈现良好(例如,在发布的问题中)。要利用MathJax,请在编写方程式时使用LaTeX表示法。有关在LaTeX中编写数学的入门知识,请参阅Wikibooks中的本指南,或美国数学学会的本简短指南
Geoff Oxberry 2012年

一个b日志C一个
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.