2010-07-17 32 views
2

J'écris un programme qui attribue des nombres premiers à chaque entrée d'une matrice et ensuite je vais devoir multiplier certains d'entre eux. Le nombre résultant augmente rapidement et je ne sais pas quel type utiliser, car je deviens "wrap-around" avec double long: Squel type à utiliser quand le double long ne suffit pas?

Toute l'aide est appréciée.

-Pickel

+3

Quelle est votre langueage mise en œuvre sur? Vous devez probablement implémenter votre propre type de données pour cela. Et il peut y avoir même quelques bibliothèques autour. –

+0

C. en avez-vous un que vous recommandez? Je suis un peu un noob: D – Pickel

Répondre

0

Vous pourriez avoir à mettre en œuvre votre propre grand type entier. Départ:

BigInt

0

Si c'est juste des entiers, il y a long long int (au moins en C/C++). Si nous parlons de doubles ... Utilisez une classe BigDecimal.

+0

Je reçois le même problème avec long long int. Je vais vérifier un BigDecimal alors. – Pickel

0

En supposant que vous utilisez "long double" comme type que c'est une affectation C ou C++?

Quelle est la taille de vos numéros?

Maximum value vs. size of long and double in .NET

discute des choses connexes, mais peut-être au-delà de la portée de votre mission

D'une manière générale, vous avez besoin d'une bibliothèque de précision arbitraire:

http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic

Mais les chances sont que pour des raisons d'une cession, vous n'êtes pas obligé de rendre les choses si compliquées que d'exiger l'utilisation d'un APL

+0

c'est une affectation C Par exemple, pour une matrice 6x6, je dois multiplier 7 * 29 * 79 * 89 * 97 * 101 * 113 * 127 * 131 * 137 * 139 * 149 * 151. – Pickel

0

si elle est un entier, utilisez la classe BigInteger (en Java ou .NET)

si elle est un point flottant, utilisez BigDecimal (uniquement en java, .net ne dispose toujours pas d'un nombre à virgule flottante précision arbitraire

Si vous êtes en C/C++, vous devez créer votre propre type

3

À moins que vous ne soyez obligé d'implémenter votre propre type de précision arbitraire, utilisez GMP. Vous voulez le type mpz_t (entier). C'est assez bien documenté, et il y a des tutoriels et des questions sur StackOverflow que vous pouvez regarder.

+0

merci! cela semble compliqué et je suis un peu noob! J'en ai juste besoin pour une infime partie du projet.Serait-il plus facile de simplement créer mon propre type? – Pickel

+0

Je veux dire * simplement créer mon propre type – Pickel

+0

Probablement pas. Je considérerais seulement faire le vôtre pour la valeur éducative, pas pour gagner du temps. –

0

Si vous refusez d'utiliser une bibliothèque et que vous ne voulez pas inventer vos propres types, pourquoi ne conservez-vous pas les facteurs supplémentaires de 2, ou quelque chose comme ça.

while (mybignum > BIGNUM_THRESH) 
{ 
    twos++; 
    mybignum /= 2; // use >>=1 if you use an integer type (you said you used double so therefore the /=) 
} 

ensuite imprimer vos réponses mybignum * 2**twos

Prenez un 64 bits int pour deux et vous êtes en sécurité jusqu'à 2^2^64

+0

Je pense que je comprends ce que vous voulez dire. question rapide cependant, si bignum est plus grand que le seuil, il apparaît négatif donc mybignum> BIGNUM_THRESH = 0, non? – Pickel

+0

à cause de cette chose "wrap-around" que je veux dire – Pickel

+0

non ce n'est pas tout à fait le point! Les types à virgule flottante fonctionnent comme la notation scientifique, avec la base 2: comme Y * 2^X, 0 mvds