Pregunta

Esto es más de un análisis numérico en lugar de cuestión de programación, pero supongo que algunos de ustedes serán capaces de responder a ella.

En los dos flotadores suma, ¿hay alguna precisión perdida? ¿Por qué?

En la suma de un flotador y un número entero, ¿hay alguna precisión perdida? ¿Por qué?

Gracias.

¿Fue útil?

Solución

  

En los dos flotadores suma, ¿hay alguna precisión perdido?

Si los dos flotadores tienen diferentes magnitud y ambos están utilizando la gama completa de precisión (de alrededor de 7 dígitos decimales) entonces sí, verá una cierta pérdida en los últimos lugares.

  

¿Por qué?

Esto es porque los flotadores se almacenan en la forma de (signo) (mantisa) × 2 (exponente) . Si dos valores tienen exponentes diferentes y se añaden ellos, entonces el valor más pequeño obtendrá reducida a menos dígitos en la mantisa (porque tiene que adaptarse a la mayor exponente):

PS> [float]([float]0.0000001 + [float]1)
1
  

En la suma de un flotador y un número entero, ¿hay alguna precisión perdido?

Sí, una normal de entero de 32 bits es capaz de representar valores exactamente que no encajan exactamente en un flotador. Un flotador todavía puede almacenar aproximadamente el mismo número, pero ya no es exactamente. Por supuesto, esto sólo se aplica a los números que son lo suficientemente grandes, i. mi. más de 24 bits.

  

¿Por qué?

Debido flotador tiene 24 bits de precisión y (32 bits) tienen números enteros 32. flotador todavía será capaz de retener la magnitud y la mayoría de los dígitos significativos, pero los últimos lugares probabilidades pueden ser diferentes:

PS> [float]2100000050 + [float]100
2100000100

Otros consejos

La precisión depende de la magnitud de los números originales. En el punto flotante, el equipo representa el número 312 internamente como notación científica:

3.12000000000 * 10 ^ 2

Los lugares decimales en el lado izquierdo (mantisa) son fijos. El exponente también tiene un límite superior e inferior. Esto le permite representar números muy grandes o muy pequeñas.

Si intenta sumar dos números que son iguales en magnitud, el resultado debe ser el mismo en cuanto a precisión, debido a que el punto decimal no tiene que moverse:

312.0 + 643.0 <==>

3.12000000000 * 10 ^ 2 +
6.43000000000 * 10 ^ 2
-----------------------
9.55000000000 * 10 ^ 2

Si ha intentado añadir un muy grande y un número muy pequeño, se perdería la precisión, ya que debe ser exprimido en el formato anterior. Considere 312 + 12300000000000000000000. Primero hay que escalar el número más pequeño para alinearse con el más grande, a continuación, añadir:

1.23000000000 * 10 ^ 15 +
0.00000000003 * 10 ^ 15
-----------------------
1.23000000003 <-- precision lost here!

punto flotante puede manejar números muy grandes o muy pequeños. Pero no puede representar a ambos al mismo tiempo.

En cuanto a enteros y dobles está añadiendo, el int se convirtió en una doble forma inmediata, a continuación, lo anterior se aplica.

Cuando la adición de dos números de coma flotante, en general hay algún error. de D. Goldberg "Lo que todo informático debe saber sobre la aritmética de punto flotante" describe el efecto y las razones en detalle, y también la forma de calcular un límite superior en el error, y la forma de razonar acerca de la precisión de los cálculos más complejos.

Al añadir un flotador a un entero, el número entero se convierte primero en un flotador por C ++, por lo que se añaden dos flotadores y se introduce error por las mismas razones que el anterior.

La precisión disponible para un float es limitado, así que por supuesto siempre existe el riesgo de que cualquier operación dada cae precisión.

La respuesta para ambas preguntas es "sí".

Si intenta añadir un flotador muy grande a uno muy pequeño, usted por ejemplo tener problemas.

O si intenta agregar un entero a un flotador, donde el entero más bits que utiliza el flotador tiene disponible para su mantisa.

La respuesta corta: un ordenador representa un flotador con un número limitado de bits, que a menudo se hace con mantisa y exponente , por lo que sólo unos pocos bytes se utilizan para los dígitos significativos, y los otros se utilizan para representar la posición del punto decimal

Si se va a tratar de añadir (por ejemplo) 10 ^ 23 y 7, entonces no será capaz de representar con precisión ese resultado. Un argumento similar se aplica cuando se añade un flotador y entero -. Entero será promovido a un flotador

  

En los dos flotadores suma, ¿hay alguna precisión perdida?   En la suma de un flotador y un número entero, ¿hay alguna precisión perdida? ¿Por qué?

No siempre. Si la suma es representable con la precisión de preguntar, y no se va a ninguna pérdida de precisión.

Ejemplo: 0,5 + 0,75 => sin pérdida de precisión          x * 0,5 => sin pérdida de precisión (excepto si x es demasiado pequeño)

En el caso general, un add flota en ligeramente diferentes rangos de modo que hay una pérdida de precisión que en realidad depende del modo de redondeo. es decir: si va a añadir números totalmente diferentes rangos, esperar que los problemas de precisión

.

Denormals están aquí para dar extra de precisión en casos extremos, a expensas de la CPU.

Dependiendo de cómo el mango compilador de punto flotante de cálculo, los resultados pueden variar.

Con la semántica estricta IEEE, la adición de dos 32 bits de flota no debe dar una mayor precisión de 32 bits. En la práctica puede requiere más instrucción para garantizar que, por lo que no se debe confiar en los resultados precisos y repetibles con coma flotante.

En ambos casos sí:

assert( 1E+36f + 1.0f == 1E+36f );
assert( 1E+36f + 1 == 1E+36f );

El caso flotador + int es el mismo que flotador + flotador, porque una conversión estándar se aplica a la int. En el caso de flotador + flotador, esto depende de la implementación, debido a que una aplicación puede optar por hacer la adición al doble precisión. Puede haber algo de pérdida cuando vaya a guardar el resultado, por supuesto.

En ambos casos, la respuesta es "sí". Al añadir un int a un float, el entero se convierte en representación de punto flotante antes de la adición se lleva a cabo de todos modos.

Para entender por qué, le sugiero que lea esta joya: Lo que todo informático debe saber sobre la aritmética de punto flotante .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top