正如 Joe 指出的那样,如果您想为正整数幂执行此操作,您可以使用NSDecimalPower()
从您的 NSDecimalNumber 派生的 NSDecimal 结构(出于性能原因,我个人更喜欢使用这些结构)。
对于使用负整数和小数值的更一般情况,我有一些我从 Dave DeLong 的 DDMathParser 库中修改的代码。他已经删除了这个库的 NSDecimal 部分,但是你可以找到这个支持的最后一次提交。我将 Dave 的指数支持扩展到以下函数:
extern NSDecimal DDDecimalPower(NSDecimal d, NSDecimal power) {
NSDecimal r = DDDecimalOne();
NSDecimal zero = DDDecimalZero();
NSComparisonResult compareToZero = NSDecimalCompare(&zero, &power);
if (compareToZero == NSOrderedSame) {
return r;
}
if (DDDecimalIsInteger(power))
{
if (compareToZero == NSOrderedAscending)
{
// we can only use the NSDecimal function for positive integers
NSUInteger p = DDUIntegerFromDecimal(power);
NSDecimalPower(&r, &d, p, NSRoundBankers);
}
else
{
// For negative integers, we can take the inverse of the positive root
NSUInteger p = DDUIntegerFromDecimal(power);
p = -p;
NSDecimalPower(&r, &d, p, NSRoundBankers);
r = DDDecimalInverse(r);
}
} else {
// Check whether this is the inverse of an integer
NSDecimal inversePower = DDDecimalInverse(power);
NSDecimalRound(&inversePower, &inversePower, 34, NSRoundBankers); // Round to 34 digits to deal with cases like 1/3
if (DDDecimalIsInteger(inversePower))
{
r = DDDecimalNthRoot(d, inversePower);
}
else
{
double base = DDDoubleFromDecimal(d);
double p = DDDoubleFromDecimal(power);
double result = pow(base, p);
r = DDDecimalFromDouble(result);
}
}
return r;
}
这将对直接映射到根的正整数幂、负整数幂和分数幂进行精确计算。但是,它仍然依靠浮点计算来计算不完全落入其中一个箱的分数幂。
不幸的是,这需要他的一些其他支持功能才能工作。因此,我上传了提供此功能的他的_DDDecimalFunctions.h和_DDDecimalFunctions.m的增强版本。它们还包括 NSDecimal 三角函数、对数和其他一些函数。目前在切线实现上存在一些收敛问题,这就是为什么我还没有完成关于此的公开帖子。