2010-10-02 22 views
6

C++, Python hassasiyet vs

(a,b) = modf(num*log10(num)) 
f_digits = pow(10,b+k-1) 
print f_digits 
Ben C aynı programı yazdığı bir num^num ilk k basamak bulma problemi çalışılıyor ++ ve Python

C++

long double intpart,num,f_digit,k; 
cin>>num>>k; 
f_digit= pow(10.0,modf(num*log10(num),&intpart)+k-1); 
cout<<f_digit; 

Python

Giriş

O ut1

C++ > 163074912 
Python > 163074908 

Sonuçları kontrol ettim C++ çözümü doğru olanıdır. http://www.wolframalpha.com/input/?i=19423474^19423474

Python içinde aynı hassasiyet elde edebilirsiniz konusunda bir fikrin adresten Kontrol Edildi ???

DÜZENLEME: Bu kesinliği elde etmek için harici kitaplık paketlerini biliyorum ama herhangi bir NATIVE çözümü ???

+0

Size her ikisi de aynı temel matematik kitaplığı (math.h), aynı temel ko-işlemciler kullanıyoruz düşünürdüm çünkü onlar, hiç farklı olduğumuz meraklı ve aynı temel IEEE 754 standart. Ama belki de python kendi sayısal kulesini yeniden yazdı. –

+0

Wolfram alpha, son birkaç hanenin, C++ veya Python kodunuzun sonucu olmayan 2826110976 olduğunu söylüyor. –

+1

@sharth: * ilk * birkaç basamak listeliyor, * son * az değil. –

cevap

9

Decimal geçerli 'GMPY' adlı bir piton sarıcı sahiptir 7somethings bir şey standart). Logaritmaların desteklenip desteklenmediğini bilmiyorum.

Düzenleme: O Sen de bunun hassas ayarlayabilirsiniz gerçekten support logarithms "and all that".

yapar. Varsayılan 28 yerdir, ancak istediğiniz kadar büyük olabilir. Ondalık için bir BigInt olarak düşünün.

+0

Ondalık ('163074912.1616735983662131415') !!! :) Teşekkürler – jknair

2

Python yüzerleri, keşfettiğiniz gibi, kaputun altında iki katına çıkar. Daha iyi kayan nokta hassasiyeti elde etmek için C koduna veya harici bir kütüphaneye başvurmanız gerekecektir.

GMP kütüphanesi iyi biri ve bir baz (10 olarak değil, IEEE doğru olarak noktaları yüzen işleme piton sınıfında inşa PyPI

+0

Kodlama yarışmasının herhangi biri harici API'lere izin vermez ve Python'da kodlamayı açık nedenlerle tercih ederim. Bu yüzden olası bir yerel çözüm istedim! – jknair

0

Genelde bunu böyle yapardım. Ancak, örnek numaralarınız için yeterince hızlı herhangi bir yerde görünmüyor.

num = 453 
k = 9 
result = num ** num 

print str(result)[:k] 
# Prints: '163111849'