¿Cuál es la respuesta para (1 + 1e20) – (1e20) y 1+ (1e20-1e20)?

La naturaleza de la pregunta y el imperativo que la acompaña para “justificar la respuesta” gritan el problema de la tarea .

Dicho esto, esta es la única respuesta que se garantiza que es correcta dada la pregunta formulada (es decir, sin ningún detalle aclaratorio): depende.

Depende del entorno en el que se evalúen estas expresiones. Quora User asumió un entorno matemático teórico (precisión infinita), mientras que la mayoría de las otras respuestas asumieron una plataforma informática de algún tipo.

Suponiendo una plataforma informática:

Depende del idioma en el que se evalúa la expresión. Por ejemplo, los términos entre los operadores podrían interpretarse como números … o cadenas (con “+” que denota la concatenación de cadenas y “-” que denota la combinación y empalme de cadenas).

Asumiendo una interpretación numérica:

Depende de la representación interna de dichos números. Las opciones incluyen, pero no se limitan a:

  1. Enteros de ancho fijo <62 bits (con la consideración de cómo se maneja el desbordamiento de enteros)
  2. Enteros de ancho fijo> = 62 bits (para los cuales el desbordamiento de enteros no es un problema)
  3. Enteros de ancho arbitrario (por ejemplo, usando la biblioteca GNU MP)
  4. Flotadores IEEE 754 de precisión simple
  5. Flotadores IEEE 754 de doble precisión
  6. Flotadores de precisión cuádruple IEEE 754
  7. Flotadores no IEEE 754
  8. Enteros simbólicos

si usa flotantes como variables:

(1 + 1e20) – (1e20) = 0

1+ (1e20 -1e20) = 1

Puedes probarlo con esto en C:

#include

int main ()
{
flotador A;
flotador B;
flotador C;
printf (“ingrese el número: \ n”);
scanf (“% g”, & A);
B = 1+ (AA);
C = (1 + A) – (A);
printf (“1 + (% lf-% lf) =% lf \ n”, A, A, B);
printf (“\ n”);
printf (“(1 +% lf) – (% lf) =% lf \ n”, A, A, C);
printf (“\ n”);
devuelve 0;
}

Si ingresa algo menor que 1e20, ambos serán 1.

Creo que 1e20 maximiza lo que puede manejar un flotador, por lo que 1e20 == 1 + 1e20
Es peor para C incrustado, si sobrepasas un registro, sucederán todo tipo de locuras.

–Karl

En términos de aritmética exacta, (1 + 1e20) – (1e20) = 1+ (1e20-1e20) = 1, pero si está hablando en cifras significativas:

(1 + 1e20) – (1e20) = (1e20) – (1e20) = 0e20 (el dígito 21 y superior son todos cero, pero no podemos decir nada sobre los dígitos menos significativos)

1+ (1e20-1e20) = 1+ (0e20) = 0e20 (misma lógica)