sirve reglas que para operaciones online numeros notacion fisica ejercicios ejemplos convertir con cientifica calculadora c++ math

c++ - reglas - operaciones con notacion cientifica



¿Cómo evitar la notación científica para números grandes? (7)

Estoy haciendo 2 ^ 1000 y estoy obteniendo esto:

1.07151e + 301

¿Hay alguna manera de convertir esto en un número correcto sin el e + 301 o al menos alguien puede mostrarme dónde puedo ver cómo convertir esto en un número real, de alguna manera trabajando con la parte e + 301

Gracias


Existe un límite práctico para la cantidad de un número que puede manipularse directamente en registros de máquinas. 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 .


Necesita usar una clase numérica 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


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


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


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

Si está midiendo la distancia desde Nueva York a París en Angstroms, elija Millas o Kilómetros en su lugar ... Excepto por requisitos matemáticos puros (como, por ejemplo, factorizar números primos para la criptología o, ... investigación sobre la Hipótesis de Reimann), hay rara vez es necesario conservar tantos dígitos de precisión.

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


cout << fijo << tu_número;

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


Entonces, estoy pensando que lo que realmente quieres es solo la capacidad 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 , intente algo como:

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

Si quieres imprimirlo como una potencia de dos (2 ^ 1000 vs 10715 ...), estás solo.