2013-06-25 30 views
7

Tôi đang gặp một số sự cố khi tính toán kết quả của một số có 8 chữ số với sức mạnh của một số có 3 chữ số lập trình trong Mục tiêu-C.Làm thế nào để tăng số lượng thực sự lớn trong Objective-C?

Lấy các số này, ví dụ: 16468920^258, sẽ dẫn đến một số là 1862 digits in length.


Tôi ngây thơ thử:

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

... nhưng result đầu ra 0.


Sau đó, tôi đã cố gắng:

long double result = powl(16468920, 258); 

... nhưng result đầu ra inf.


Sau finding out about NSDecimal, tôi đã cố gắng này:

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

... nhưng result đầu ra NaN, vì vậy tôi cố gắng:

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

... nhưng mã này đặt ra một NSDecimalNumberOverflowException.


Bất kỳ con trỏ nào tôi sẽ đi theo hướng nào?

+0

Bạn sẽ phải sử dụng một trong các thư viện được đề cập ở đây -> http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic vì lưu trữ số đó dưới dạng số nhị phân đơn giản có nghĩa là Chúa chỉ biết số lượng bits – borrrden

+3

Bạn cần phải suy nghĩ về những gì bạn có thể có thể làm với số này một khi bạn nhận được nó. (Khoảng 5610 bit, BTW hoặc 701 byte.) –

Trả lời

3

Từ Objective-C là một superset của C, bạn có thể sử dụng một thư viện C như một 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(). 

Xem, ví dụ, here cho làm thế nào để có được openssl vào iOS.

+1

Hoàn hảo! Điều này dường như đã thực hiện các trick! Tôi đã sử dụng cổng [OpenSSL for iOS] (https://github.com/st3fan/ios-openssl) cùng với [Wrapper cho các hàm toán học BigNumber của OpenSSL] (https://github.com/davedelong/CHMath) để xuất kết quả dưới dạng 'NSString'! – gomollon

0

Bạn nhận được vấn đề đó vì kết quả của bạn vẫn lớn hơn NSDecimalNumber có thể lưu trữ.

Tôi khuyên bạn nên sử dụng JKBigInteger thay vào đó, đó là trình bao bọc Objective-C quanh thư viện LibTomMath C. Và thực sự dễ sử dụng và hiểu.

Hy vọng điều này có thể hữu ích.

Các vấn đề liên quan