gpt4 book ai didi

objective-c - NSDecimalNumber 的 NSDecimalNumber 次方

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:35 27 4
gpt4 key购买 nike

我有两个 NSDecimalNumbers,我需要将一个应用于另一个的幂,最初这段代码使用的是 double ,我可以使用 pow() 函数来计算它,如下所示:

double result = pow(value1, value2);

我遇到的问题是我正在将代码转换为使用 NSDecimalNumbers,尽管它们包含方法 toThePowerOf,但它只接受 int 值。目前,我对这个问题唯一的解决办法是临时转换 NSDecimalNumbers,但这会导致精度损失。

double value1 = [decimal1 doubleValue];
double value2 = [decimal2 doubleValue];

double result = pow(value1, value2);
NSDecimalNumber *decimalResult = [[NSDecimalNumber alloc] initWithDouble:result];

有没有一种方法可以使用 NSDecimalNumbers 进行计算而不丢失精度?

我需要它来处理非整数值,例如:

value1 = 1.06
value2 = 0.0277777777

最佳答案

正如 Joe 所指出的,如果您想对正整数幂执行此操作,您可以在派生自 NSDecimalNumber 的 NSDecimal 结构上使用 NSDecimalPower()(我个人更喜欢使用这些结构,因为performance reasons ).

对于使用负整数和小数值的更一般情况,我有一些代码是我从 Dave DeLong 的 DDMathParser 库中修改的。他已经删除了这个库的 NSDecimal 部分,但你可以找到 the last commit for this support .我将 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 三角函数、对数和一些其他函数。目前在切线实现上存在一些收敛问题,这就是为什么我还没有完成关于这个的公开帖子。

关于objective-c - NSDecimalNumber 的 NSDecimalNumber 次方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12094011/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com