[英]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.