web-dev-qa-db-fra.com

Int128 dans .Net?

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.

60
Adam Tegen

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");
40
Larsenal

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.

25
Rick Sladkey

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

12
Jon Skeet

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

}
2
sbeskur

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 .

2
Charles Burns

Bibliothèque C # PCL pour les calculs avec de grands nombres tels que Int128 et Int256. https://github.com/everbytes/BigMath

1
Alexander Logger

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

1
Brett Allen