7

我在 Objective-C 中以编程方式计算 8 位数字的结果到 3 位数字的幂时遇到了一些麻烦。

以这些数字为例:16468920^258,这应该产生一个长度为 1862 位的数字


我天真地尝试过:

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

…但是result输出0


然后我尝试了:

long double result = powl(16468920, 258);

…但是result输出inf


了解了 NSDecimal之后,我尝试了这个:

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

…但是result输出NaN,所以我尝试了:

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

…但是这段代码引发了一个NSDecimalNumberOverflowException.


关于我应该往哪个方向前进的任何指示?

4

2 回答 2

3

由于 Objective-C 是 C 的超集,您可以使用诸如BN之类的 C 库:

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(). 

例如,请参阅此处了解如何将 openssl 导入 iOS。

于 2013-06-25T02:38:07.887 回答
0

你得到这个问题是因为你的结果仍然更大,NSDecimalNumber可以存储。

我建议您可以改用JKBigInteger,它是 LibTomMath C 库的 Objective-C 包装器。并且非常易于使用和理解。

希望这会有所帮助。

于 2015-08-17T06:43:07.687 回答