J'ai besoin de faire de gros calculs entiers. Existe-t-il des classes ou des structures qui représentent un entier de 128 bits et implémentent tous les opérateurs habituels?
BTW, je me rends compte que la décimale peut être utilisée pour représenter un int 96 bits.
C'est ici dans System.Numerics. "Le type BigInteger est un type immuable qui représente un entier arbitrairement grand dont la valeur n'a en théorie aucune limite supérieure ou inférieure."
var i = System.Numerics.BigInteger.Parse("10000000000000000000000000000000");
Bien que BigInteger
soit la meilleure solution pour la plupart des applications, si vous disposez de calculs numériques critiques pour les performances, vous pouvez utiliser le Int128
et UInt128
implémentations dans ma bibliothèque Dirichlet.Numerics . Ces types sont utiles si Int64
et UInt64
sont trop petits mais BigInteger
est trop lent.
Non, il n'y a rien dans .NET <= 3.5. J'espère/m'attends à ce que BigInteger fasse son retour dans .NET 4.0. (C'était coupé de .NET 3.5 .)
Si cela ne vous dérange pas de faire référence à la bibliothèque J # (vjslib.dll inclus avec VS par défaut), il existe déjà une implémentation de BigInteger dans .NET
using Java.math;
public static void Main(){
BigInteger biggy = new BigInteger(....)
}
BigInteger est désormais une partie standard de C # et des amis dans .NET 4.0. Voir: Blog ASP.NET de Gunnar Peipman . Notez que le CPU peut généralement travailler avec des entiers ordinaires beaucoup plus rapidement et en temps constant, en particulier lors de l'utilisation des opérateurs mathématiques habituels (+, -, /, ...) car ces opérateurs sont généralement mappés directement sur des instructions CPU uniques.
Avec BigInteger, même les opérations mathématiques les plus élémentaires sont des appels de fonction beaucoup plus lents aux méthodes dont l'exécution varie en fonction de la taille du nombre. Cela est dû au fait que BigInteger implémente une arithmétique de précision arbitraire, ce qui ajoute une surcharge considérable mais nécessaire. L'avantage est que les BigIntegers ne sont pas limités à 64 ou même 128 bits, mais par la mémoire système disponible (ou environ 2 ^ 64 bits de précision, selon la première éventualité). Lisez ici .
Bibliothèque C # PCL pour les calculs avec de grands nombres tels que Int128 et Int256. https://github.com/everbytes/BigMath
GUID est soutenu par un entier de 128 bits dans le cadre .NET; bien qu'il ne vienne avec aucune des méthodes de type entier typiques.
J'ai écrit un gestionnaire pour GUID avant de le traiter comme un entier de 128 bits, mais c'était pour une entreprise pour laquelle j'ai travaillé il y a environ 8 ans. Je n'ai plus accès au code source .
Donc, si vous avez besoin d'une prise en charge native d'un entier 128 bits et que vous ne voulez pas compter sur BigInteger pour une raison quelconque, vous pourriez probablement pirater GUID pour servir vos besoins).