2008-11-05 132 views
19

que estoy haciendo 2^1000 y estoy haciendo esto:¿Cómo se evita la notación científica para números grandes?

1.07151e + 301

¿Hay alguna manera de convertir en realidad este en un número adecuado sin la e + 301 o al menos alguien me puede mostrar dónde puedo ver cómo convertir esto en un número real, por alguna forma de trabajo con el e + 301

parte

Gracias

+0

¿Podría esto venir desde aquí? http://projecteuler.net/index.php?section=problems&id=16 –

+1

En binario es simple: un 1 seguido de 1000 ceros. Cree un algoritmo simple para hacer una división larga y esté ordenado (dividido repetidamente por 1010 y sumando los residuos). – Skizz

+0

Es _un_ número correcto. –

Respuesta

9

Por lo tanto, estoy pensando que lo que realmente quiere es solo la posibilidad de imprimirlo sin notación científica. Si está utilizando printf, lo que quiere es:

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

Con cout, intentar algo como:

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

Si desea imprimir como una potencia de dos (2^1000 vs 10715 ...), estás sólo en esto.

+0

Gracias, esto realmente mostró el número correctamente :) – AntonioCS

+0

¿Hay alguna forma en que pueda colocar la salida en una cadena en lugar de imprimirla en la pantalla? – AntonioCS

+1

Simplemente use snprintf. Tenga en cuenta que dado que este número es solo una potencia de dos, no pierde ninguna información, pero si intentamos lo mismo con digamos 3^1000, un doble no podrá almacenar toda la precisión necesaria. – Eclipse

10

Es necesario utilizar una clase número diseñada específicamente para números largos.

Para representar 2^1000 como un número exacto, entonces, por definición, necesita un formato numérico que en realidad contenga 1001 bits binarios. El formato entero primitivo normal más largo suele ser de solo 64 bits.

Por cierto, la respuesta es:

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

corregido para corregir el error uno a uno – Alnitak

+1

Si intenta tomar el perl del Mbigint, el Phantom lo golpeará y se lo devolverá. No es bueno robar tribus pigmeas. A menos que seas Indiana Jones. –

+0

Supongo que sabes esto, pero esta es una pregunta del Proyecto Euler. Algunos podrían considerar un poco distante explicar explícitamente la mayor parte de la solución. – Beska

0

que está recibiendo como precisa un número como el tipo de variable puede soportar. Ese número es del orden de 1 seguido de 301 ceros. Para obtener un número preciso, tendrá que trabajar con una biblioteca que admita números grandes, o trabaje con un lenguaje que esté hecho para ese tipo de matemática (arce, matlab, etc.)

13

Existe un límite práctico de cómo un gran número que puede ser manipulado directamente en registros de máquina puede serlo. si está utilizando flotadores de doble precisión, hay un total de 64 bits, algunos de los cuales están dedicados a la mantisa, algunos al exponente y 1 al bit de signo.

2^1000 necesita un entero de 1001 bits para ser representado sin perder precisión. Para trabajar con números como ese, necesitará usar una biblioteca que tenga un gran número de soporte, como GNU MP.

+1

1001 bits, en realidad :) 2^1 necesita 2 bits; y por inducción desde allí. –

+0

Tiene razón, gracias por señalarlo, lo he editado para reflejarlo. –

+0

La terminación parece estar cortada de la primera oración: "Hay un límite fundamental de cuán grande puede ser un número" debería decir realmente "Existe un límite práctico sobre qué tan grande se puede representar un número en un registro de máquina " – florin

2

cout < < fijo < < tu_numedad;

Pero probablemente no muestre el número entero. Como alguien dijo antes, necesitas escribir una clase.

4

Si desea hacerlo usted mismo en C++, puede, por ejemplo, crear una matriz de dígitos y hacer el cálculo usted mismo. Ejemplo probado y verificado:

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

Una opción, si su lógica de aplicación permitirá que es cambiar las unidades está manipulando ....

Si se está midiendo la distancia desde Nueva York a París en Angstroms, seleccionar millas o kilómetros en su lugar. ... Excepto por requisitos matemáticos puros (como por ejemplo, factorizar números primos para criptología o, ... investigación en la hipótesis de Reimann), rara vez hay necesidad de conservar tantos dígitos de precisión.

Por otro lado, si está haciendo algo que requiere valores enteros perfectamente precisos con tantos dígitos, entonces probablemente debería obtener un software especializado diseñado para manejar grandes cantidades ... Este software está definitivamente disponible, aunque estoy no está familiarizado con esa área. (costos, proveedores, capacidades, etc.) Si el costo es un problema, y ​​está pensando en escribir el suyo, no sé lo suficiente sobre lo que implica saber si ese enfoque vale la pena el esfuerzo ...

-1

Incluir el encabezado limits.h y cmath.h

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

uso cout.precision para establecer la precisión.

+0

Esta solución ya se dio aquí hace casi una década. –

Cuestiones relacionadas