2011-11-18 14 views
13

Vektörler ve çeşitli trigonometri için bazı destek sınıfları oluşturmaya ad-hoc işlevlerini kullanmaya devam etmekten daha mantıklı olduğu bir projeye başladım. Bunun için pek çok C++ kütüphanesi olmasını beklerim, ama hızımı ve alıştığım özellikleri feda etmek istemiyorum.C++ kütüphanesi, hız isteğe bağlı yaklaşımlarla optimize edilmiş?

Özellikle, tamsayı açılarını kullanabilmek için istiyorum ve böyle yaklaşımları tarafından tanınan çarpıcı hızı tutmak istiyorum: Gerçekten orada herhangi vardır, ben gereksiz kendi rulo önce Yani

static inline int32_t sin_approx(int32_t angle) 
//Angle is -32768 to 32767: Return -32768 to 32767 
{ 
    return (angle<<1) - ((angle*abs(angle))>>14); 
} 

C++ için kullanılan sabit tamsayı kütüphaneleri, kullanılan tamsayıların genişliğini belirtebildiğim ve bakması gereken yukarıdaki gibi hızlı yaklaşımları olan vektörler gibi şablon sınıfları ile mi?

+0

Bu günah için nasıl bir yaklaşımdır? – TonyK

+0

Gerçekten bilmiyorum. Bir yıl önce kayan nokta sinek yaklaştırmasına dayanarak, sanırım, bazı parabolik fonksiyonları kullanarak yazdım. Tamsayıya çekildikten sonra, yukarıdaki sonuçlandı. Orijinal işlevi unuttum Artık nasıl çalıştığını bilmiyorum. Yine de neredeyse mükemmel bir daire çiziyor. – porgarmingduod

+2

Oh, şimdi onu görüyorum. Aralığın her bir yarısına 0 ve 2'de sıfırlar ve maks/dk değeri +/- 1 olan bir parabol olarak yaklaşır. Güzel! – TonyK

cevap

4

Bu yolu birkaç yıl önce kayan noktadan sabit noktaya bazı ses parmak izi kodlarını dönüştürmek zorunda kaldım. Sert parçalar, DCT (büyük bir kosinüs masası) ve yüksek hassasiyetli bir logaritma idi. Mevcut kütüphaneler yolunda şaşırtıcı derecede az şey buldum. O zamandan beri, orijinal Sony PlayStation'ın (PS1) hiçbir kayan nokta desteğinin olmadığını duydum. Bu nedenle, eğer hala var ise, sizin için geliştirme forumları (fori?) Aradığınız şeyi bulabilir. Çalıştığım bazı kişiler, NewMat kütüphanesi ile, trigonometriden ziyade doğrusal cebire doğru yönlendirilmiş olsa da, kayan nokta sayılarına odaklanmış gibi görünüyor. Yine de, site kontrol etmeye değer görünüyor this list yol açar. Ayrıca sabit nokta desteği için iyi olabilecek bir sinyal işleme kitaplığı da bulduğum spuc. Ve yıllar önce Fraunhofer'den bir sinyal işleme şablonu kütüphanesi (sptl) gördüm. Bence tescilliydi ama bir şekilde mevcut olabilir.

Tüm söylenenler, sanırım sahip olduklarınızla oldukça yakınsınız. Sinüs fonksiyonunuz olduğundan, girişi uygun şekilde dönüştürdüğünüzde temel olarak bir kosinüs fonksiyonuna sahip olursunuz (cos(x) == sin(x + pi/2)). Tanjant, sinüs ve kosinüsün (tan(x) = sin(x)/cos(x)) bölümü olduğundan, temel olarak trigonometri için oradasınız.

Vektörlerle ilgili olarak, STL vektörleri ve valarray sınıfları, STL algoritmalarıyla birleştirilmediyse, siz de yakınlaşır mısınız? Değilse, her zaman Boost'un math libraries'u vardır.

Üzgünüz, sizi aradığınız gümüş mermiye gösteremiyorum, ama yapmaya çalıştığınız şey bu günlerde oldukça nadirdir. Hassasiyet isteyen kişiler genellikle modern işlemciler üzerinde iyi bir performansa ve kayan kütüphane desteğine sahip olan kayan noktaya giderler. Kaynak kısıtlı donanım üzerinde hız isteyenlerin genellikle hassas olmalarına gerek yoktur ve vektör tarafından trig yapmıyorlar ve muhtemelen C++ yapmıyorlar. Bence en iyi seçeneğin kendi kendine yuvarlanmak. Bunu yeniden keşfetmekten ziyade, tekerlek tasarım modelini yeni bir bağlamda uygulamak olarak düşünmeye çalışın. :)

+0

Pek çok iyi bilgi, gerçekten. Boost'un geometri kütüphanesini kaçırdığımı görmek için şok oldum (her halükarda overkill olmasına rağmen) – porgarmingduod