web-dev-qa-db-fra.com

Existe-t-il une API mathématique pour Pow (décimal, décimal)

Existe-t-il une bibliothèque pour le calcul décimal, en particulier la méthode Pow(decimal, decimal)? Je n'en trouve pas.

Cela peut être gratuit ou commercial, dans tous les cas, tant qu'il y en a un.

Remarque: je ne peux pas le faire moi-même, je ne peux pas utiliser de boucles, ni Math.Pow, Math.Exp ni Math.Log, car ils prennent tous doubles et je ne peux pas utiliser doubles Je ne peux pas utiliser une série car elle serait aussi précise que doubles.

31
Maxime ARNSTAMM

L'un des multiplicateurs est un taux: 1/taux ^ (jours/365). 

La raison pour laquelle il n’existe pas de fonction de puissance décimale est qu’il serait inutile d’utiliser decimal pour ce calcul. Utilisez double

N'oubliez pas que le point décimal est de vous assurer d'obtenir une arithmétique exacte sur les valeurs qui peuvent être exactement représentées sous la forme short nombres décimaux. Pour des valeurs raisonnables de rate et days, les valeurs de n'importe laquelle des autres sous-expressions sont clairement pas vont être exactement représentées sous forme de valeurs décimales courtes. Vous allez avoir affaire à des valeurs inexactes, utilisez donc un type conçu pour les calculs rapides de valeurs légèrement inexactes, comme double.

Les résultats, calculés en double, vont perdre quelques milliardièmes de penny d'une manière ou d'une autre. On s'en fout? Vous compléterez l'erreur plus tard . Faites le calcul du taux en double. Une fois que vous avez un résultat qui doit être reconverti dans une devise, multipliez le résultat par dix mille, arrondissez-le au nombre entier le plus proche, convertissez-le en décimal, puis divisez-le de nouveau par dix mille et vous ' Vous obtiendrez un résultat précis à quatre décimales, ce qui devrait suffire pour un calcul financier.

45
Eric Lippert

Voici ce que j'ai utilisé. 

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

Maintenant, je suis en train d'apprendre, mais cela a fonctionné, mais je ne sais pas si je peux l'expliquer correctement. 

je crois que cela prend l’entrée var1 et var2 et les convertit en doubles à utiliser comme arguments de la méthode math.pow. Ensuite, ayez (décimal) devant math.pow, ramenez la valeur en décimal et placez-la dans la variable de sortie. 

J'espère que quelqu'un pourra me corriger si mon explication est fausse, mais tout ce que je sais, c'est que cela a fonctionné pour moi. 

7
Andrew

Eh bien, voici la page Wikipedia qui répertorie les bibliothèques actuelles de nombres C #. Mais TBH je ne pense pas qu'il y ait beaucoup de soutien pour les nombres décimaux 

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

C'est un peu inapproprié d'utiliser des décimales pour ce genre de calcul en général. C'est de haute précision, oui - mais c'est aussi une gamme basse. Comme le disent les documents MSDN, il s’agit de calculs financiers/monétaires, où il n’ya malheureusement pas grand-chose à faire pour un prisonnier de guerre!

Bien sûr, vous pourriez avoir un domaine de problème spécifique qui nécessite une très grande précision et tous les nombres sont compris entre 10 (28) et 10 (-28). Mais dans ce cas, vous n'aurez probablement besoin que d'écrire votre propre calculateur de séries, tel que celui lié aux commentaires de la question.

2
James Gaunt

Ne pas utiliser decimal. Utilisez double à la place. Selon ce fil, Math.Pow (double, double) est appelé directement à partir de CLR.

Comment Math.Pow () est-il implémenté dans .NET Framework?

Voici ce que propose .NET Framework 4 (2 lignes uniquement)

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

La décimale 64 bits n’est pas encore native dans ce CLR 32 bits. Peut-être sur un framework 64 bits dans le futur?

0
Jeson Martajaya