Pregunta

Después de una hora de tratar de encontrar un error en mi código por fin he encontrado la razón. Yo estaba tratando de añadir un pequeño flotador a 1F, pero no pasaba nada. Al tratar de averiguar por qué he encontrado que la adición de ese pequeño flotador para 0f funcionó a la perfección.

¿Por qué sucede esto? ¿Esto tiene que ver con 'órdenes de magnitud'? ¿Hay alguna solución a este problema?

Gracias de antemano.

Editar:

El cambio de doble precisión o decimal no es una opción en este momento.

¿Fue útil?

Solución

Debido a la precisión para una precisión simple (32 bits) valor de coma flotante es de alrededor de 7 dígitos después del punto decimal. Lo que significa que el valor va a añadir es esencialmente cero, al menos cuando se añade a 1. El valor en sí, sin embargo, puede almacenarse fácilmente en un flotador ya que el exponente es pequeña en ese caso. Sin embargo, para agregar correctamente a 1 usted tiene que utilizar el exponente del número más grande ... y luego los dígitos después de los ceros desaparecen en el redondeo.

Puede utilizar double si necesita más precisión. En cuanto al rendimiento esto no debe hacer una diferencia en el hardware y la memoria de hoy es a menudo tampoco es tan limitado que usted tiene que pensar en cada variable individual.

EDIT: Como se afirmó que el uso de double no es una opción que podría utilizar Kahan suma , como akuhn señaló en un comentario.

Otra opción puede ser la de realizar cálculos intermedios en doble precisión y después emitidos a float nuevo. Esto sólo va a ayudar, sin embargo, cuando hay unas cuantas más operaciones que simplemente añadir un número muy pequeño a uno más grande.

Otros consejos

Esto probablemente se debe a que el número de dígitos de precisión en un flotador es constante, pero el exponente puede variar obviamente.

Esto significa que aunque puede agregar su número de pequeñas a 0, no se puede esperar para añadirlo a un número que tiene un exponente diferente de 0, ya que no solo no será suficiente dígitos de precisión izquierda.

Debe leer Lo que todo informático debe saber sobre la aritmética de punto flotante .

Parece que tiene algo que ver con la precisión de punto flotante. Si yo fuera usted, que haría uso de un tipo diferente, como decimal. Eso debería corregir los errores de precisión.

Con float, que sólo recibe un precisión de alrededor de siete dígitos . Por lo que su number'll se redondeará en 1f. Si desea almacenar tal cantidad, en vez utilizar double

http://msdn.microsoft.com/en-us/library /ayazw934.aspx

Además de la respuesta aceptada: Si necesita sumar muchos número pequeño y algunos más grandes, se debe utilizar Kahan Suma .

Si el rendimiento es un problema (porque no se puede utilizar double), a continuación, escala binaria / fijo punto puede ser una opción. floats se almacenan como números enteros, pero escaladas por un gran número (por ejemplo, 2 ^ 16). aritmética intermedio se realiza con las operaciones de enteros (relativamente rápido). La respuesta final se puede convertir de nuevo a punto flotante en el extremo, dividiendo por el factor de escala.

Esto se suele hacer si el procesador objetivo carece de una unidad de hardware de punto flotante.

Se utiliza el sufijo f en sus literales, lo que hará que estos flotadores en lugar de dobles. Así que su flotación muy pequeña se desvanecerá en el flotador más grande.

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