SORU
11 NİSAN 2011, PAZARTESİ


Neden std::pow () double, int C 11 çıkarıldı mı?

Efficient way to compute p^q (exponentiation), where q is an integer bakarak ve C 98 C 11 standartlar gözden geçirirken anlaşılan std::pow(double, int) aşırı C 11'de çıkarıldığını gördüm.

C 98 26,5 iken/6 double pow(double, int); imzası vardır.

C 11 26.8 tek bulabildiğim buydu aşırı alarak bir çift float, double long double ve bir açık unutmayın diye bir karışım parametre türleri ayrılmaz&çift, bu pow(double, double) aşırı yük olmalı seçti.

Bu önceki niyeti, yanlış eklendi onlar C aslında C çıkarıldı 98, 11, veya başka bir şeyden sadece bir açıklama.

Belli ki pow(double, int) sürümü kaldırıldı olmaları garip görünüyor yani optimizasyon için iyi bir fırsat sağlar. Bir derleyici hala standartları gibi optimize edilmiş bir yük sağlamak için uygun olurdu?

CEVAP
11 NİSAN 2011, PAZARTESİ


double pow(double, int);

kaldırılmış olmadı spec. Sadece sonucu elde edilen olmuştur. O şimdi yaşıyor [c.matematik]/p11. Hesaplanır nasıl bir uygulama ayrıntı. Değişen sadece C 03 imzası

float pow(float, int);

Bu şimdi çift sayı:

double pow(float, int);

Vebudeğişim C uyumluluk için yapıldı.

Açıklama:

26.8 [cmath] / p11 diyor ki:

Ayrıca, ek olacaktır aşırı yeterli sağlamak için:

  1. Eğer herhangi bir bağımsız değişken bir çift parametre karşılık gelen türü uzun çift varsa sonra tüm değişkenler için karşılık gelen çift etkili parametreler döküm uzun çift için.

  2. Herhangi bir bağımsız değişken bir çift parametre karşılık aksi takdirde, tipi çift veya bir tamsayı yazın sonra tüm değişkenler için karşılık gelen çift etkili parametreler döküm çift için.

  3. Aksi takdirde, tüm değişkenleri double parametreleri karşılık geliyor etkin yüzer döküm.

Bu paragraf aşırı bir bütün ana dahil savunuyor

double pow(double, int);
double pow(double, unsigned);
double pow(double, unsigned long long);

vb.

Bu gerçek aşırı olabilir, ya da kısıtlı şablonları ile uygulanabilir. Kişisel olarak iki şekilde uygulanan ettik ve şiddetle sınırlı şablon uygulaması iyilik.

İkinci güncelleme optimizasyon sorunları gidermek için:

Bu uygulama herhangi bir aşırı yük optimize etmek için izin verilir. Ama bir iyileştirme olması gerektiğini hatırlayınsadecebu. Optimize edilmiş sürümü aynı cevabı dönmek lazım. Deneyimlerinden uygulayıcıları fonksiyonları gibi pow o zaman gitme zahmetine emin olun sizin uygulama alarak, ayrılmaz bir üs verir aynı cevap olarak uygulama alarak bir kayan nokta üs, "optimizasyon" genellikle daha yavaş.

Aşağıdaki program pow(.1, 20) iki kez, std kullanarak yazdırır bir örnek::pow, ikinci kez bir kullanma"," algoritma ayrılmaz üs yararlanarak: . optimize

#include <cmath>
#include <iostream>
#include <iomanip>

int main()
{
    std::cout << std::setprecision(17) << std::pow(.1, 20) << '\n';
    double x = .1;
    double x2 = x * x;
    double x4 = x2 * x2;
    double x8 = x4 * x4;
    double x16 = x8 * x8;
    double x20 = x16 * x4;
    std::cout << x20 << '\n';
}

Benim sistem bu çıktı:"

1.0000000000000011e-20
1.0000000000000022e-20

Veya onaltılık gösterimde:

0x1.79ca10c92422bp-67
0x1.79ca10c924232p-67

Ve evet, savaş esiri olan uygulayıcıları gerçekten düşük sonunda bu bit, merak etme.

O zaman özgürlük yoktur shuffle pow(double, int) için ayrı bir algoritma, en uygulayıcıları farkındayım vazgeçmiş bu strateji ile olası özel durum kontrolü için çok küçük ayrılmaz üslü. Ve bu durumda, optimizasyon paranın karşılığını büyük patlama almak için bir kayan nokta üs ile uygulanmasına onay koymak için genellikle yararlı olur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ryan Billy

    Ryan Billy

    30 EKİM 2006
  • Sam Kear

    Sam Kear

    14 Temmuz 2007
  • thenewboston

    thenewboston

    4 ŞUBAT 2008