2009-03-01 9 views
7

Je travaille sur une application qui devra gérer de très grands nombres.Types pour les grands nombres

J'ai vérifié quelques classes LargeNumber disponibles et j'en ai trouvé quelques-unes dont je suis content. J'ai une classe pour les grands entiers et pour les grands nombres à virgule flottante. Étant donné que certains des nombres seront petits et certains grands, la question est de savoir si cela vaut la peine de vérifier la longueur du nombre et si elle est petite utiliser un C# int ou double et si elle est grande utiliser les autres classes I J'ai ou si j'utilise déjà les classes Large Integer et Large Float, je devrais rester avec eux même pour les plus petits nombres.

Ma considération est purement une performance. Vais-je économiser assez de temps sur le calcul pour les plus petits nombres qu'il serait utile de vérifier chaque numéro AFTER est est mis en

+0

Quelles classes utilisez-vous pour les grands nombres? – ahsteele

+0

Je joue avec quelques-uns. Microsoft.FSharp.Math.BigInt Microsoft.SolverFoundation.Common.BigInteger http://www.codeproject.com/csharp/biginteger.asp IntX décimaux J'utilise w3b.sine Microsoft.FSharp.Math.BigNum Je vais faire quelques points de repère sur chacun d'eux et voir ce que je reçois – Sruly

+0

S'il vous plaît voir ce ([question] http: //stackoverflow.com/questions/494923/numbers-that-exceeds-basic-types-in-c). –

Répondre

2

vraiment difficile de dire -. Cela dépend de vos bibliothèques 3ème partie :)

meilleur pari serait d'utiliser la classe System.Diagnostics.StopWatch, faire un gazzillion différents calculs, les chronométrer et comparer les résultats, je suppose ..

[EDIT] - A propos des tests de performance, je ferais une série de tests de votre largeInt-type pour faire les calculs sur les nombres 32/64 bits réguliers, et une série vérifiant si le nombre peut tenir dans les types Int32/Int64 réguliers (ce qu'ils devraient), les "downcasting" à ces types, puis exécutez le même calcu lations utilisant ces types. De votre question, cela ressemble à ce que vous allez faire si les types intégrés sont plus rapides.

Si votre application est ciblée pour plus de personnes que vous, essayez de les exécuter sur des machines différentes (unipolaire, multicœur , Plates-formes 32 bits, 64 bits), et si la plate-forme semble avoir un impact important sur la durée des calculs, utilisez une sorte de schéma de stratégie pour effectuer les calculs différemment sur des machines différentes.

Bonne chance :)

+0

Quels types de tests de référence feriez-vous? – Sruly

+0

@Sruly - ceux qui dupliquent le type de maths dont votre application a besoin ;-p –

+0

Mise à jour de la réponse originale avec des trucs spécifiques au benchmark: P – cwap

2

Je pense qu'une bibliothèque NOMBREUX décent serait en mesure de faire cette optimisation sur son propre ...

2

Je dirais que oui, le chèque sera plus payer lui-même, tant que vous avez suffisamment de valeurs dans la gamme régulière.

La logique est simple: une addition entière est une instruction d'assemblage. Combiné avec une comparaison, c'est trois ou quatre instructions. Toute implémentation logicielle d'une telle opération sera probablement beaucoup plus lente.

De manière optimale, cette vérification doit être effectuée dans les bibliothèques LargeNumber elles-mêmes. S'ils ne le font pas, vous pouvez avoir besoin d'un emballage pour éviter d'avoir des vérifications partout. Mais alors vous devez penser au coût supplémentaire de l'emballage.

0

Travaillé dans un projet où les mêmes champs devaient manipuler de très grands nombres et en même temps manipuler la précision pour de très petits nombres. La finit avec stocker aux champs (mantisse et exposant) pour chaque nombre de ce genre.
Nous avons fait une classe pour les calculs de mantisse/exposant et cela a bien fonctionné.

Questions connexes