2013-06-25 9 views
7

Sto riscontrando qualche problema nel calcolare il risultato di un numero a 8 cifre sulla potenza di un numero a 3 cifre programmaticamente in Objective-C.Come esponenziare numeri veramente grandi in Objective-C?

Prendere questi numeri, ad esempio: 16468920^258, che dovrebbe risultare in un numero che è 1862 digits in length.


ingenuamente cercato:

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

... ma result uscite 0.


Poi provato:

long double result = powl(16468920, 258); 

... ma result uscite inf.


Dopo finding out about NSDecimal, ho provato questo:

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

... ma result uscite NaN, quindi provato:

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

... ma questo codice sollevano NSDecimalNumberOverflowException.


Tutti gli indicatori su quale direzione dovrei andare?

+0

Dovrai utilizzare una delle librerie menzionate qui -> http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic perché per memorizzare quel numero come un semplice numero binario vorrebbe dire che Dio solo sa quanti bit – borrrden

+3

Devi pensare a cosa puoi fare con questo numero una volta ottenuto. (Circa 5610 bit, BTW o 701 byte) –

risposta

3

Dal Objective-C è un superset di C, è possibile utilizzare una libreria C come un 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(). 

Vedi, per esempio, per here come ottenere OpenSSL in iOS.

+1

Perfetto! Questo sembra aver fatto il trucco! Ho usato la porta di [OpenSSL per iOS] (https://github.com/st3fan/ios-openssl) insieme a [Wrapper per OpenSSL's BigNumber funzioni matematiche] (https://github.com/davedelong/CHMath) a mostra il risultato come 'NSString'! – gomollon

0

Si ottiene quel problema perché il risultato è ancora più grande che NSDecimalNumber potrebbe memorizzare.

Si consiglia di utilizzare JKBigInteger invece, è un wrapper Objective-C attorno alla libreria C LibTomMath. E davvero facile da usare e capire.

Spero che questo possa essere d'aiuto.

Problemi correlati