SORU
7 Mart 2010, Pazar


Neden Standart C kütüphanelerinde int power(int base, int üs) değil mi?

Sadece bulamıyor olmalıyım gibi hissediyorum. C pow fonksiyonu değil uygulamak herhangi bir nedenle "güç" bir şey hariç şamandıralar ve çiftler işlevi?

Bu uygulama önemsiz olduğunu biliyorum, ben standart bir kütüphanede olması gereken işi ben yapıyorum gibi hissediyorum. Sağlam bir güç işlevi (yani biraz tutarlı, açık bir şekilde taşma kolları) eğlenceli yazmak için değil.

CEVAP
7 Mart 2010, Pazar


Sabit genişlikli ayrılmaz herhangi bir türü için, olası giriş neredeyse tüm taşma tipi, yine de bulabilirsiniz. Olası girdilerin büyük çoğunluğu için yararlı bir sonuç vermez, yani bir işlevi standardize etmek neye yarar?

Çok yararlı bir işlevi, ve en büyük tamsayı kütüphaneler işlevini sağlamak için büyük bir tamsayı türü olması gerekir.


Düzenleme:, Static_rtti yazar "En giriş taşmaya neden? sorusu üzerine bir yorum Aynı exp için doğru ve double pow, kimsenin şikayet ettiğini görmedim." Bu yanlıştır.

Hadi konumuz aslında benim davam daha güçlü kılacak olsa) ve double pow(double x, double y) odaklanmak çünkü ** 0, bir kenara bırakınız. Ne bölümü (x,y) çiftleri için bu işlev yararlı bir şey (yani, sadece taşma ya da üstünde)?

Ben aslında gitmeyi odağı yalnızca küçük bir kısmı giriş çift için hangi pow mantıklı, çünkü bu yeterli dediğimi kanıtlamak için: eğer x pozitif ve |e| <= 1, pow değil taşma ya da üstünde. Bu oluşur yaklaşık dörtte biri tüm kayan nokta çiftleri (tam yarısı olmayan NaN kayan noktalı sayılar pozitif ve sadece yarısından az olmayan NaN kayan noktalı sayılarda büyüklük, 1'den küçük). Belli ki, vardırbir sürühangi pow yararlı sonuçlar üretir diğer giriş çiftleri, ama en azından tüm girdilerin dörtte biri olduğunu öğrendik.

Şimdi, sabit genişlikli (non-bignum yani tamsayı güç fonksiyonuna bak. Ne bölümü girişler için sadece taşma değil mi? Anlamlı giriş çift sayısı en üst düzeye çıkarmak için temel imzalanan ve üs işaretsiz olmalıdır. Taban ve üs n Her iki bit olduğunu varsayalım. Kolayca bir anlamlı olan giriş kısmına bağlı alabiliriz:

  • Üs 0 veya 1, Herhangi bir temel yoksa o zaman anlamlı olur.
  • Eğer üs değeri 2 veya daha büyük ise, hiçbir temel 2^(n/2) daha büyük anlamlı bir sonuç üretir.

Böylece 2^(2n) giriş çift, 2^(n 1) daha az 2^(3/2) anlamlı sonuçlar üretir. Eğer büyük olasılıkla, 32-bit tamsayı en yaygın kullanımı ne bakacak olursak, bu giriş çift biri oranında 1/1000 sipariş üzerine bir şey sadece taşma anlamına gelir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • Codecourse

    Codecourse

    3 ŞUBAT 2009
  • Le Cargo !

    Le Cargo !

    24 HAZİRAN 2007