繁体   English   中英

NSDecimalNumber为NSDecimalNumber的强大功能

[英]NSDecimalNumber to the power of NSDecimalNumber

我有两个NSDecimalNumbers,我需要将一个应用到另一个的功能,原来这个代码使用了双倍,我可以用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() (出于性能原因 ,我个人更喜欢使用结构)。

对于使用负整数和小数值的更一般情况,我有一些代码,我从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三角函数,对数和一些其他函数。 目前在切线实现方面存在一些收敛问题,这就是为什么我还没有完成关于此问题的公开发布。

我最近遇到了同样的问题并开发了我自己的功能来做到这一点。 该函数将计算任何基数到任何幂,只要它确定真实答案如果它确定无法计算实际答案它返回NSDecimalnumber.notANumber

我发布了我的解决方案作为我发布的相同问题的答案,所以这里是链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM