views:

37

answers:

2

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.

A: 

You can first convert decimalNumber to its doubleValue and then just call the pow function of C++. I haven't tried it but I think it should work. Refer: http://stackoverflow.com/questions/1061005/calling-objective-c-method-from-c-method for mixing c++ and objective c.

cooltechnomax
+1  A: 

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).

KennyTM
It is an integral power in this case, your answer is perfect
Cirrostratus