Увеличьте NSDecimalNumber до отрицательной степени - PullRequest
3 голосов
/ 29 августа 2010

Мне нужен эквивалент функции pow () C, которая будет работать с NSDecimalNumbers. С pow вы можете использовать отрицательные числа, например pow(1514,-1234), с помощью decimalNumberByRaisingToPower: метода NSDecimal вы вынуждены использовать NSUInteger, который, кажется, требует положительного значения.

Я бы хотел сделать что-то вроде этого:

[decimalNumber decimalNumberByRaisingToPower:-217.089218];

или

[decimalNumber decimalNumberByMultiplyingByPowerOf10:-217];

без сбоев из-за переполнения или исключений из-за переполнения.

Ответы [ 3 ]

4 голосов
/ 29 августа 2010

Математически a ^ (- b) == 1 / (a ​​^ b). Поэтому, если вам просто нужно поднять до отрицательной интегральной мощности,

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

Для нецелых степеней нет никакого способа, кроме (1) реализовать алгоритм pow() самостоятельно или сторонними библиотеками, или (2) выполнить вычисления с плавающей запятой (таким образом, потеряв точность).

1 голос
/ 19 января 2011

Кстати, вы, похоже, правы насчет decimalNumberByRaisingToPower, но из документов Apple:

(NSDecimalNumber *) decimalNumberByMultiplyingByPowerOf10: (короткая) мощность

Это не без знака.

0 голосов
/ 29 августа 2010

Вы можете сначала преобразовать decimalNumber в его doubleValue, а затем просто вызвать функцию pow в C ++. Я не пробовал это, но я думаю, что это должно работать. См .: Вызов метода Objective-C из метода C ++? для смешивания c ++ и цели c.

...