簡體   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