Search code examples
iphonensdecimalnumber

Raise an NSDecimalNumber to a negative power


I need an equivalent to C's pow() function that will work with NSDecimalNumbers. With pow you can use negative numbers e.g. pow(1514,-1234), with NSDecimal's decimalNumberByRaisingToPower: method, you are forced to use an NSUInteger which seems to require a positive value.

I'd like to be able to do something like this:

[decimalNumber decimalNumberByRaisingToPower:-217.089218];

or

[decimalNumber decimalNumberByMultiplyingByPowerOf10:-217];

without crashing from overflow or underflow exceptions.


Solution

  • Mathematically, a^(-b) == 1/(a^b). Therefore, if you just need to raise to a negative integral power,

    decimalNumber = [decimalNumber decimalNumberByRaisingToPower:1234];
    decimalNumber = [[NSDecimalNumber one] decimalNumberByDividingBy:decimalNumber];
    

    For non-integral powers, there's no way except (1) implement the pow() algorithm yourself or by 3rd party libraries, or (2) performing the calculation in floating point (thus losing precisions).