2008-11-05 13 views
19

que je fais 2^1000 et je reçois ceci:Comment éviter la notation scientifique pour les grands nombres?

1.07151e + 301

Est-il possible de transformer effectivement cela en un nombre approprié sans e + 301 ou au moins quelqu'un peut me montrer où Je peux voir comment transformer cela en un nombre réel, par une certaine façon de travailler avec l'e + 301

partie

Merci

+0

Est-ce que ça pourrait venir d'ici? http://projecteuler.net/index.php?section=problems&id=16 –

+1

En binaire c'est simple - un 1 suivi de 1000 zéros. Créez un algorithme simple pour faire la division longue et vous êtes trié (diviser de façon répétée par 1010 et additionner les restes). – Skizz

+0

Il s'agit d'un nombre correct. –

Répondre

9

Alors, je pense que ce que vous voulez vraiment est juste la possibilité d'imprimer sans la notation scientifique. Si vous utilisez printf, ce que vous voulez est:

printf("%f1000.0", value); 
// note that 1000 is way larger than need be, 
// I'm just too lazy to count the digits 

Avec cout, essayez quelque chose comme:

cout.setf(ios::fixed); 
cout << setprecision(0) << value; 

Si vous souhaitez imprimer comme une puissance de deux (2^1000 vs 10715 ...), tu es tout seul.

+0

Merci cela a vraiment montré le nombre correctement :) – AntonioCS

+0

Y at-il un moyen que je peux placer la sortie dans une chaîne au lieu de l'imprimer sur l'écran ?? – AntonioCS

+1

Utilisez simplement snprintf. Notez que puisque ce nombre est juste une puissance de deux, vous ne perdez aucune information, mais si vous essayez la même chose avec disons 3^1000, un double ne serait pas capable de stocker toute la précision nécessaire. – Eclipse

10

Vous devez utiliser une classe numérique spécialement conçu pour les numéros longs.

Pour représenter 2^1000 comme un nombre exact, vous avez besoin par définition d'un format numérique qui contient 1001 bits binaires. Le plus long format d'entiers primitifs normaux est habituellement de seulement 64 bits.

BTW, la réponse est:

% perl -Mbigint -e 'print 2**1000' 
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 
+0

corrigé pour corriger l'erreur off-by-1 – Alnitak

+1

Si vous essayez de prendre le Perl depuis le Mbigint, le Phantom va vous battre et vous le rendre. Ce n'est pas bien de voler des tribus pygmées. Sauf si vous êtes Indiana Jones. –

+0

Je suppose que vous le savez, mais c'est une question du projet Euler. Certains pourraient considérer qu'il est un peu distendu d'énoncer explicitement la plupart des solutions. – Beska

0

Vous obtenez un nombre aussi précis que le type de variable peut prendre en charge. Ce nombre est de l'ordre de 1 suivi de 301 zéros. Pour obtenir un nombre précis, vous devrez travailler avec une bibliothèque qui prend en charge de grands nombres, ou travailler avec un langage qui est fait pour ce genre de mathématiques (érable, matlab, etc)

13

Il existe une limite pratique à la façon dont un grand nombre qui peut être directement manipulé dans les registres de la machine peut être. Si vous utilisez des flottants double précision, il y a un total de 64 bits, dont certains sont consacrés à la mantisse, certains à l'exposant, et 1 au bit de signe.

2^1000 a besoin d'un entier de 1001 bits pour être représenté sans perte de précision. Afin de travailler avec des nombres comme ça, vous devrez utiliser une bibliothèque qui a un grand nombre de support, comme GNU MP.

+1

1001 bits, en fait :) 2^1 a besoin de 2 bits; et par induction à partir de là. –

+0

Vous avez raison, merci de l'avoir signalé, j'ai modifié pour refléter cela. –

+0

La fin semble être coupée de la première phrase: "Il y a une limite fondamentale à la taille d'un nombre" devrait dire "Il y a une limite pratique sur la façon dont un nombre peut être représenté dans un registre de machine " – florin

2

cout < < fixe < < votre_number;

Mais il ne montrera probablement pas le nombre entier. Comme quelqu'un l'a déjà dit, vous devez écrire un cours.

4

Si vous voulez le faire vous-même en C++, vous pouvez par exemple créer un tableau de chiffres et faire le calcul vous-même. par exemple testé et vérifié:

unsigned int result[400]; // result digits 
unsigned int i, j, carry; 

// Initialize result digits 
for (i = 0; i < 399; i++) { 
    result[i] = 0; 
} 
result[399] = 2; 

for (i = 2; i <= 1000; i++) { // Calculate 2^i 
    carry = 0; 
    for (j = 399; j > 0; j--) { 
    result[j] <<= 1; // multiply with 2 
    result[j] += carry; // add carry 
    carry = result[j]/10; 
    result[j] %= 10; // we want one digit (0-9) only 
    } 
} 

printf("2^1000 = "); 
// print result digits 
for (i = 0; i < 400; i++) { 
    if (result[i] != 0) { // no leading zeros, please 
    for (j = i; j < 400; j++) { 
     printf("%d", result[j]); 
    } 
    break; 
    } 
} 
printf("\n"); 
2

Une option, si votre logique de l'application permettra est de changer les unités que vous manipulez ....

Si vous mesurez la distance de New York à Paris en angströms, choisissez Miles ou Kilomètres à la place. ... Excepté pour les exigences mathématiques pures, (comme dire les nombres premiers d'affacturage pour la cryptologie ou, ... recherche dans l'hypothèse de Reimann), il y a rarement besoin de retenir que beaucoup de chiffres de précision.D'autre part, si vous faites quelque chose qui nécessite des valeurs entières parfaitement précises avec autant de chiffres, alors vous devriez probablement avoir un logiciel spécialisé conçu pour gérer de grands nombres ... Un tel logiciel est certainement disponible, bien que je sois pas familier avec cette zone. (coûts, fournisseurs, capacités, etc.) Si le coût est un problème, et que vous songez à écrire le vôtre, je ne sais pas assez de quoi il s'agit pour savoir si cette approche en vaut la peine ...

-1

Inclure l'en-tête limits.h et cmath.h

cout.precision(0); 
cout<< fixed<< pow(2,31);    //OR ANY NUMBER HERE 

Utilisez cout.precision pour définir la précision.

+0

Cette solution a déjà été donnée il y a presque dix ans. –

Questions connexes