2012-06-19 26 views
35
C++, ISO özelliklerine göre

, § 26.2/2:Neden C++ bu karmaşıklığı yalnızca float, double veya long double için örneklendirilebilir?

float, double veya long double belirtilmemiş olan başka herhangi bir tür için şablon complex başlatmasını etkisi.

Standart yazarlar bu kısıtlamayı neden açıkça eklerler? Bu, onu belirtilmemiş kılar, örneğin complex<int> veya complex<MyCustomFixedPointType> yaparsanız ne olur ve yapay bir kısıtlama gibi görünür.

Bu sınırlamanın bir nedeni var mı? Kendi özel türünüzle complex örneğini oluşturmak istiyorsanız bir geçici çözüm var mı?

Ben öncelikle OP abscomplex<int> için tuhaf çıkışları veriyordu neden olarak karıştı edildiği çünkü this earlier question bu soruyu soruyorum. Bununla birlikte, bu, complex sayılarını sabit nokta türlerinden, yüksek hassasiyetli gerçek sayılardan vb. Yapmak isteyebileceğimiz göz önüne alındığında, bu durumun mantıklı bir anlamı yoktur.

+4

Önceki cevabınızı gördükten sonra gülmem gerekiyordu, ama bu gerçekten iyi bir soru. – chris

+9

@ chris- Bunun için üst düzey bir sebep vermeden bu cevabı vermekte kötü hissettim. Genelde "bu, X, Y ve Z nedenleri için C++ 'nın tuhaf bir durumudur" diyerek genellikle iyiyim, ama bu sefer ne olduğu hakkında hiçbir fikrim yok. – templatetypedef

+4

"Komplekste standardının karmaşıklaştırılması on yıldan uzun bir süredir tartışılıyor ve en az bir tedarikçiden destek için önemli bir direnç var." http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-March/020398.html –

cevap

28

Tamsayılarda std::complex işlemlerinin çoğunu düzgün bir şekilde uygulayamazsınız. karmaşık sayılar (gerçek, imag) çiftler olarak temsil edilir zaman sqrt(pow(z.real(), 2) + pow(z.imag(), 2)) değerini verir çünkü örneğin bir complex<long> için

template <class T> 
T abs(const complex<T> &z); 

, T = long dönüş değerine sahip olamaz. Operasyonların sadece birkaçı mantıklı olacaktır.

Daha da kötüsü, polar adlı yapıcı, varsayılan yapıcıyı bozmadan ve tam tersi güvenilir yapılamaz. Standart, "karmaşık tamsayıların" herhangi bir kullanım için Gaussian integers olduğunu ve kuruculardan birinin ciddi şekilde kırıldığını belirtmek zorundadır.

Son olarak, "karmaşık tamsayı bölümünüzün" nasıl sunulmasını istersiniz ve bununla birlikte "karmaşık bir geri kalanı" ister misiniz? :)

özetlenmesi, bunu std::complex üzerine ayrılmaz T için greft desteği daha sadece birkaç operasyonları ile ayrı gaussian_int<T> türünü belirtmek için daha mantıklı olacağını düşünüyorum.

+1

Komik nasıl aynı işlevi göstermek için seçtik. :) –

+0

Karar için katı bir matematiksel sebep tanıttığınız için teşekkür ederiz. Bence bu karar için zarif bir teorik sebep sunuyor. Daha önce Gaussian tam sayılarını duymamıştım, bu yüzden onları getirdiğiniz için teşekkürler! – templatetypedef

+0

@templatetypedef: Soru için teşekkürler ve +1. Kompleks türler üzerinde karmaşık bir şey olduğunda ne olacağını asla düşünmemiştim. [Ben bir matematikçi değilim, ve eğer bu konuda beni yanlış anlatabilirseniz, lütfen yapın.] –

12

Muhtemelen yardımcı fonksiyonlarla uyumluluk için.

template<class T> T abs (const complex<T>& x); 

T == int ise abs hassasiyet içinde büyük bir kayıp anlamına gelecektir int, dönecekti: Örneğin.

İlgili konular