Есть ли математический API для Pow (десятичный, десятичный) - PullRequest
33 голосов
/ 21 июня 2011

Есть ли библиотека для десятичных вычислений, особенно метод Pow(decimal, decimal)? Я не могу найти ни одного.

Он может быть бесплатным или коммерческим, в любом случае, если таковой имеется.

Примечание: я не могу сделать это сам, не могу использовать циклы, не могу использовать Math.Pow, Math.Exp или Math.Log, потому что все они занимают double с, а я не могу используйте double с. Я не могу использовать серию, потому что она будет такой же точной, как double с.

Ответы [ 5 ]

45 голосов
/ 21 июня 2011

Один из множителей - это ставка: 1 / ставка ^ (дней / 365).

Причина отсутствия функции десятичной степени в том, что было бы бессмысленно использовать decimal для этого вычисления. Используйте double.

Помните, что десятичная точка должна гарантировать, что вы получите точную арифметику со значениями, которые могут быть точно , представленными как короткие десятичные числа. Для разумных значений rate и days значения любых других подвыражений явно , а не , которые будут точно представлены в виде коротких десятичных значений. Вы будете иметь дело с неточными значениями, поэтому используйте тип, предназначенный для быстрых вычислений слегка неточных значений, например double.

Результаты, рассчитанные в двойных единицах, будут отклоняться на несколько миллиардов копеек, так или иначе. Какая разница? Вы исправите ошибку позже . У расчета ставки в двойниках. Получив результат, который необходимо снова превратить в валюту, умножьте результат на десять тысяч, округлите его до ближайшего целого числа, преобразуйте в десятичное число, а затем снова разделите на десять тысяч, и вы результат будет с точностью до четырех знаков после запятой, что должно быть достаточно для финансовых расчетов.

7 голосов
/ 12 февраля 2013

Вот что я использовал.

output = (decimal)Math.Pow((double)var1, (double)var2);

Сейчас я только учусь, но это сработало, но я не знаю, смогу ли я объяснить это правильно.

я полагаю, что для этого нужно взять входные данные var1 и var2 и привести их к двойным значениям, чтобы использовать их в качестве аргумента для метода math.pow.После этого поместите (десятичное) перед math.pow значение обратно в десятичное и поместите значение в выходную переменную.

Я надеюсь, что кто-то может исправить меня, если мое объяснение неверно, но все, что я знаю, это то, что оно сработало для меня.

2 голосов
/ 21 июня 2011

Ну, вот страница Википедии, в которой перечислены текущие библиотеки чисел C #. Но я не думаю, что есть большая поддержка десятичных знаков

http://en.wikipedia.org/wiki/List_of_numerical_libraries

Это неуместно использовать десятичные дроби для такого рода расчетов в целом. Это высокая точность, да, но это также низкий диапазон. Как утверждают документы MSDN, они предназначены для финансовых / денежных расчетов, где, к сожалению, не так много призывов к военнопленным!

Конечно, у вас может быть конкретная проблемная область, которая требует сверхвысокой точности, и все числа находятся в пределах 10 (28) - 10 (-28). Но в этом случае вам, вероятно, просто нужно написать свой собственный калькулятор серии, такой как тот, на который есть ссылка в комментариях к вопросу.

0 голосов
/ 16 февраля 2012

Не используется decimal. Вместо этого используйте double. Согласно этой теме, Math.Pow (double, double) вызывается непосредственно из CLR.

Как Math.Pow () реализован в .NET Framework?

Вот что есть в .NET Framework 4 (только 2 строки)

[SecuritySafeCritical]
public static extern double Pow(double x, double y);

64-битная десятичная дробь пока не является родной в этом 32-битном CLR Может быть, на 64-битной платформе в будущем?

0 голосов
/ 21 июня 2011

подожди, а? почему вы не можете использовать двойные? вы всегда можете разыграть, если используете интт или что-то еще:

int a = 1;
int b = 2;
int result = (int)Math.Pow(a,b);
...