2015-05-13 21 views
5

9^19 hesaplamak için arıyorum. Benim kodudur:C++ cinsinden yüksek doğrulukta (10^19) güç hassasiyeti nasıl artırılır?

cout.setf(ios::fixed, ios::floatfield); 
    cout.setf(ios::showpoint); 
    cout<<pow(9,19)<<endl; 

sonuç 0 eşit son 2 basamak: 1350851717672992000. Python'da, 9**19 bana 1350851717672992089L'u gönderdi. Kayan noktalı bir sorun gibi görünüyor. pow için hassaslığı nasıl yükseltebilirim? veya pow'dan daha iyi bir hassas güç nasıl oluşturulur?

Gcc sürüm 4.8.2 ile derliyorum.

+5

Çift kullanıyorsunuz. Uzun çift veya uzun uzun kullanmak, daha iyi çalışır (platforma bağlı olarak). –

+3

'uint64_t' işlevini kullanın ve kendi' pow' işlevinizi yazın – mch

+1

Python, tamsayılar için isteğe bağlı kesinlik aritmetiğine sahiptir. C++ ile bunu isterseniz 3. parti "bignum" kütüphanesini kullanmanız veya kendiniz oluşturmanız gerekir. –

cevap

9

Bu gerçekten bir kayan nokta sorunudur: Tipik bir 64-bit double yalnızca 53 bit veya yaklaşık 15 ondalık basamak, kesinlik verir.

long double'dan daha hassas olabilirsiniz (veya olmayabilir). Veya, yaklaşık 10 'a kadar olan tamsayılar için uint64_t'u kullanabilirsiniz. Aksi takdirde, daha hassas bir standart tip yoktur: GMP veya Boost.Multiprecision gibi bir kitaplığa ihtiyacınız olacaktır.

1

double hassasiyeti 16 ondalık basamaktır.

Bu, yalnızca ilk 16 ondalık hanesinin doğru olduğu anlamına gelir, hanelerin geri kalanı da gürültü kadar iyidir.