Hangi daha hızlı hesaplanır,


10

Hangi daha hızlı hesaplanır, veya log a c veya b ablogac ? a,bvec,b>1olan pozitif gerçeklerdir.cbbirbcb>1

Karşılaştırmada ne tür algoritmalar kullanacaksınız? Karmaşıklıkları neler?

Örneğin, veya c a bcbirbcbirb

Bu sorudan, Matematik yığını değişim sorusundaki yorumlardan ilham alınmıştır . Stirling'in bir faktöriyete yaklaşımının amacı nedir? . Özellikle, mjqxxxx , Thomas Andrews ve ben tarafından bırakılan yorumlar .


Moderatörler de görünüşe göre düzenlemeleri onaylayabilir. @ MarkBooth'un önerisine katılıyorum ve önerdiği gibi soruya dahil ettim.
Aron Ahmadia

Amaçlarına hizmet ettikleri için yorumları derlemeden (silmek) çekinmeyin. * 8 ')
Mark Booth

Yanıtlar:


8

İlgili bazı sorunlar için bu soruya verdiğim cevaba bakın .

Genel olarak, bilgisayarlar yalnızca toplama, çıkarma, çarpma, bölme ve bit kaydırma yapabilir. Tartışmanın iyiliği için, diyelim ki olduğunuzu varsayalım değil hesaplanırken birb nereye özel durumda 2 ve bir güçtür bbirb bu durumda biraz değişime azaltır ve bu nedenle kolay olduğundan, doğal bir sayıdır.

Eğer b doğal sayıdır ve Hesaplamak istediğiniz kullanabileceğiniz bir ek zincir üsbirb . Sorunuzdaki diğer tüm durumlar (genel olarak) zordur.

Bu işlevleri yüksek doğrulukta tahmin etmek için kullanılan bazı hızlı algoritmalar kara büyü gerektirir. "Kara büyü" ile ne demek istediğimi görmek için, Martin Ankerl'in bu blog yazısına ve Neural Computation'da bağlantı verdiği ilgili bir makaleye göz atın . Ayrıca CORDIC algoritmasına bakın.

Hacker Delight'ta benzer türden saydam hileler açıklanmaktadır (bağlantı, kitabın refakatçi web sitesidir).

İyi yaklaşımları hesaplamanın diğer yolları sayısal analiz kullanır ( Yaklaşım Teorisi hakkındaki Wikipedia makalesine bakın) ). Bunu yapmanın kötü bir yolu, uygun bir diferansiyel denklemi düzeltmek ve Euler yöntemi gibi sayısal bir yöntem kullanarak entegre etmektir (dediğim gibi, kötü bir yaklaşım, ancak bunu yapabilirsiniz). Bunu yapmanın daha iyi bir yolu seri yaklaşımları kullanmaktır. Taylor serisi çok yavaş birleşiyor, bu nedenle Padé yaklaşımı veya başka tür hızlı yakınsak seri yaklaşımı gibi bir şey kullanılabilir (diğer rasyonel yaklaşımlar, Chebyshev serisi, vb.).

Yukarıdaki işlevlere yaklaşmak için kullandığınız algoritma mimarinize, hız gereksinimlerinize ve doğruluk gereksinimlerinize bağlı olacaktır.

Karmaşıklıklardan bahsetmeyle ilgili sorun, herhangi bir algoritmanın bahsettiğiniz işlevlerin sadece bir kayan nokta yaklaşıklığını hesaplayacağıdır, bu nedenle çalışma süresi kesinlikle yaklaşık olarak talep ettiğiniz doğruluğa bağlı olacaktır. Bunu dikkate alarak bile, hesaplama karmaşıklığının performansın iyi bir ilk yaklaşımı olduğunu düşünmüyorum; girişlerinizin boyutu bit cinsinden ölçülecektir (yani , b ve c'yi temsil etmek için gereken bit sayısıbirbc), sayısal girdilerin kendilerinin büyüklüğüne bağlı olarak değil, hassasiyete bağlı olacaktır. Pratik amaçlar için, sayıların sayısal sunumunun kesinliği çok fazla değişmeyecektir (tek hassasiyet, çift hassasiyet, dört hassasiyet) ve genellikle bu hassasiyeti skaler fonksiyonların herhangi bir hesaplama karmaşıklığı tahminine dayanarak kullanmaya karar vermezsiniz . En alakalı metrik duvar saati süresidir ve özel bir mimari (gömülü sistemler) kullanmıyorsanız veya uygulamanız gerçekten hızlı bir üs gerektirmedikçe (blog yazısı bağlantısına ve yukarıdaki Nöral Hesaplama bağlantısına bakın), seçim dili muhtemelen gayet iyi.


4

Bu iyi bir soru çünkü sayısal algoritmaları ve performansı anlamak etkili bir hesaplamalı bilim adamı olmanın önemli bir önkoşuludur. Aynı zamanda, bu zayıf bir sorudur, çünkü ortaya konan kısıtlamalar, anlamlı bir cevap vermeye yeteri kadar yeterli değildir.

Üç hesaplamanın performansı, nihai sonuçta ihtiyaç duyulan doğruluğa ve ayrıca işlenenleri temsil etmek için gereken minimum hassasiyete bağlı olacaktır. Sen hak , b ve c pozitif reel sayı olarak, ama biz de ikili rakam kaç bilmek gerekir d nbirbcdn bunları doğru bir şekilde temsil etmek için gereklidir. Genel reel sayılar için performansla ilgili hususları anlamak için öncelikle bilgisayarların tamsayıları nasıl temsil ettiğini ve gerçek sayıları kayan noktalı sayıları kullanarak nasıl yaklaştırdığını anlamamız gerekir.

Bilgisayarlar arasında bir tamsayıdır faaliyet zaman , daha sonra gerekli ikili basamak sayısı tabii ki günlüğüne eşit 2 tamsayı büyüklüğü, artı işareti işlemek için bir ilave bit:M2

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

Örneğin, -8 sayısı 4 ikili basamakla temsil edilebilir. Performans ve alan verimliliği için, modern işlem birimlerindeki tamsayıların sayısal hesaplamalarından sorumlu olan aritmetik mantık birimleri (ALU'lar), belirli bir boyuta kadar tamsayılardaki matematiği işlemek için tasarlanmıştır, bu günlerde en yaygın olanı d = 32 ve d = 64. Bilgisayarınızda olduğu gibi sadece x86 işlemcilerin ALU'ları değil, günümüz elektronik toplumunda her yerde bulunan bilgisayar mimarisinin temel yapı taşıdır. Video oyun konsollarına aşina iseniz, konsolun işlemcisindeki aritmetik mantık birimleri boyutundan (bit olarak) adlandırılan bir video oyun sistemi olan Nintendo 64'ü hatırlayabilirsiniz.

Aritmetik mantık birimleri üzerindeki tamsayı toplama, çıkarma ve çarpma işlemleri çok verimlidir ve genellikle hesaplamak için birden fazla döngü gerektirmez. Bölümler daha az performans gösterir ve modern işlemcilerde birkaç düzine döngü gerektirebilir. Performans, hem işlem biriminin mimarisine (hem de aritmetik mantık biriminin karşılık gelen uygulamasına) ve frekansına bağlıdır. 64 bit işlemcinin bit işlenenlerinde genellikle 1 ile 64 arasında herhangi bir yerde x için aynı hızda aritmetik gerçekleştirebileceğini unutmayın .xx

Genel hesaplamada ve özellikle bilimsel hesaplamada, tamsayı matematik birçok hesaplama için gereksizdir ve 'kayan nokta' gösterimi olarak adlandırılan başka bir sayı gösterimi gereklidir. Kayan nokta sayıları, modern mikroişlemcilerin çalışma şekli ( bit parçalarında veri toplama ) ve sabit bir taban b (genellikle b = 2 veya bnbb=2 ), ve iki tamsayı, bazı çevrelerde bir mantis (significand) kullanılarak sayısını temsil eden s ve bir üs e . Belirli bir sayı xb=10sex daha sonra yaklaşık olarak şu şekilde temsil edilir:

x=s*be

Yaklaşık olarak söylüyorum çünkü bu gibi basit gerekçelerin bile açık olması gerekir 13 , standart bazlar için tam olarak bir kayan nokta sayısı olarak gösterilemez. Öneme bağlı basamak sayısı ve kendi büyüklüğüne göre sayının doğruluğunu belirler. IEEE 754 standart significand ve mantisin aralıkları dahil olmak üzere (ve aralığı ve hassasiyetini karşılık gelir) birkaç önemli değerleri için kayan nokta sayılarının beklenmektedir nasıl bir kural sayıda davranmaya belirtir, , o kadar sayısal hesaplamalar içinde tekrarlanabilir olduğu bazı hoşgörü. Bu cevapta yakalamayı umamadığım kayan nokta sayılarının nasıl çalıştığına dair biraz incelik var, iyi bir tanıtım için "Her Bilgisayar Bilimcisinin Kayan Nokta Aritmetiği Hakkında Bilmesi Gerekenler"dn.

Son 50 yılda önemli miktarda entelektüel çaba, aritmetik kayan nokta işlemlerini verimli bir şekilde hesaplamak için işlemci kapasitesinin artırılmasına yatırım yapmıştır. Modern işlemcilerde bu hesaplamalar, kayan nokta sayıları üzerinde aritmetik işlemler gerçekleştirmek için tasarlanmış ve genellikle her iki IEEE 754 tarafından belirtilen 32'yi işlemek için tasarlanmış olan aritmetik mantık biriminin daha karmaşık bir sürümü olan bir veya daha fazla Kayan Nokta Birimi (FPU) tarafından işlenir. -bit kayan nokta sayıları (genellikle 'şamandıralar' olarak adlandırılır) ve 64 bit kayan nokta sayıları (genellikle 'çiftler' olarak adlandırılır) verimli bir şekilde. Aritmetik mantık birimlerine benzer şekilde, kayan noktalı birimler genellikle toplama, çıkarma ve çarpma işlemlerini yalnızca birkaç döngüde hesaplayabilirken, bölme genellikle biraz daha fazlasını gerektirir.

Çoğu durumda, IEEE 754 64-bit kayan nokta 'çiftler' sayısal hesaplamalar için yeterlidir, bu yüzden , b vebirb her birinin 64 bit çiftler olarak temsil edildiğini ve x87 kayan noktalı yönerge alt kümesini kullanarak bir Intel Nehalem mimarisinde skaler işlemler olarak üç hesaplama, yani bu işlemleri bir for döngüsünde veya bir veri aralığında hesaplamakla ilgilenmezsiniz ve vektör uzantılarını kullanmak istemezsiniz . Komut gecikmesi bilgileriAgner Fog'unIntel / AMD mimarileri içinmükemmel talimat referans tablolarındantoplanır.c

  1. birb
  2. günlükbirc
  3. c1b

1 Genel üs alma genellikle aşağıdaki kimlikle uygulanır:

birb=βbirgünlükβb

Burada ya olup 2 ya da E (bu durumda, I kullanma β = 2 ). Sonuçta bir miktar doğruluk atmak istediğinizi varsayarsak (x87 ünitesi hesaplarını 80 bit hassasiyetle yapar, ancak bu a ve b için belirli değer aralıkları için yetersizdir ), bu hesaplama FYL2X donanım talimatı ile yapılabilir hesaplamak için t = a log 2 b ve F2XM1 donanım talimatı (bazı ölçeklendirme yardımı ile)β2eβ=2birbt=birgünlük2b . Ölçeklendirmeyi ele almak için ~ 20 döngü varsayarsak:2t

FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 devir

2 Bu, iki logaritmaya ve temel kimliğin değişmesiyle bölünmeye dönüştürülebilir ve doğru bir sonuç için yeniden ölçeklendirmeye gerek yoktur.

2 * FYL2X + FDIV = 2 * 80 + (7 ila 27) = 167 ila 187 döngü

[3] Bu, bir bölme ve ardından üs alma ile eşdeğerdir, bu nedenle [1] artı FDIV, ~ 175 döngü.


0

Soruyu açıklayabilir miyim bakayım:

birbgünlükbir(c)bir

Cevap : bu gerçekten c'nin a'ya herhangi bir bağımlılığı olup olmadığına ve bir b'nin b ile nasıl karşılaştırıldığına (daha büyük, daha küçük veya eşit) bağlıdır.

cbbir

cgünlükbir(c)=ln(c)/ln(bir)günlükbir(c)birbbirbirb=ω(günlükbir(c))

c=birbgünlükbir(birb)=bbbirblÖgbir(c)birb=ω(günlükbir(c))

cbirbbirbc=Θ(birb) , bu da varsayım 2'deki ile aynı sonucu verir.

günlükbir(c)c1/b .

birbc

cc1/bbc1/b=Ö(günlükbir(c))

c=birbgünlükbir(c)=birc1/b=birgünlükbir(c)=Θ(c1/b)

cbirbbirbc

c1/bbirb

cc1/bbirbc1/b=Ö(birb)

c=birbc1/b=birb>1birbc1/b

birbc


Yorumlarımı iki bölüme ayıracağım: üslup ve içerik. Stilistik olarak, yazınıza denklemler eklediğiniz için teşekkür ederiz. Lütfen MathJax'ı kullanacak şekilde yeniden biçimlendirin, böylece güzel bir şekilde görüntülenebilirler (örneğin, yayınlanan soruda olduğu gibi). MathJax'tan yararlanmak için denklemlerinizi yazarken LaTeX notasyonunu kullanın. LaTeX'te matematik yazma hakkında bir astar için , Wikibooks'taki bu kılavuza veya Amerikan Matematik Derneği'nin bu kısa rehberine bakın .
Geoff Oxberry

birbgünlükcbir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.