2013-06-25 9 views
7

8 basamaklı bir sayının sonucunu, Objective-C'de programlı olarak 3 basamaklı bir sayının gücüne hesaplamakta sorun yaşıyorum.Objective-C'de gerçekten çok sayıda sayı nasıl bulunur?

örneğin bu sayıları ele alalım: 16468920^258, 1862 digits in length olan bir takım yan etkiler gereken.


Ben safça çalıştı:

unsigned long long result = 1; 
for (int i = 0; i < 258; i++) 
    result *= 16468920; 

... ama result çıkışları 0.


Sonra çalıştı:

long double result = powl(16468920, 258); 

... ama result çıkışları inf.


finding out about NSDecimal sonra bu çalıştı:

NSDecimal result; 
NSDecimal number = [[NSDecimalNumber decimalNumberWithString:@"16468920"] decimalValue]; 
NSDecimalPower(&result, &number, 258, NSRoundPlain); 

... ama result çıkışları NaN, bu yüzden denedim:

NSDecimalNumber *number = [[NSDecimalNumber alloc] initWithInt:16468920]; 
NSDecimalNumber *result = [number decimalNumberByRaisingToPower:258]; 

... ama bu kod bir NSDecimalNumberOverflowException yükseltir.


olarak gitmeliyim için yön Herhangi işaretçiler?

+0

Burada sözü edilen kütüphanelerin birini kullanmak zorunda olacak - Allaha anlamına geleceğini düz ikili sayı olarak bu sayıyı saklamak için çünkü> http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic sadece bilir kaç tanesi bit – borrrden

+3

Elinize geçtikten sonra bu numara ile neler yapabileceğinizi düşünmelisiniz. (Yaklaşık 5610 bit, BTW veya 701 bayt.) –

cevap

3

Objective-C C bir üst olduğundan, bir C kütüphanesi kullanabilirsiniz böyle bir BN:

int BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BN_CTX *ctx); 

BN_exp() raises a to the p-th power and places the result in r ("r=a^p"). This 
function is faster than repeated applications of BN_mul(). 

bakınız, örneğin, iOS içine openssl almak için nasıl here. NSDecimalNumber saklamak olabilir Sonuç hala büyük çünkü

+1

Mükemmel! Bu hile yapmış gibi görünüyor! Bu [OpenSSL BigNumber matematik işlevleri için Wrapper] (https://github.com/davedelong/CHMath) için olan [iOS için OpenSSL] (https://github.com/st3fan/ios-openssl) boyunca limanına kullanılan sonucu bir "NSString" olarak çıktı! – gomollon

0

bu seçeneğin sorunu olsun.

Ben LibTomMath C kütüphanesinde etrafında bir Objective-C sarıcı, sen yerine JKBigInteger kullanabilirsiniz öneriyoruz. Kullanımı ve anlaşılması gerçekten çok kolay.

Bu yardımcı olabilir umarım.

İlgili konular