Pregunta

Hace años aprendí de manera difícil sobre problemas de precisión con flotadores, así que dejé de usarlos. Sin embargo, todavía me encuentro con el código usando flotantes y me da vergüenza porque sé que algunos de los cálculos serán inexactos.

Entonces, ¿cuándo es apropiado usar un flotador?

EDITAR: Como información, no creo haber encontrado un programa en el que la precisión de un número no sea importante. Pero me interesaría escuchar ejemplos.

¿Fue útil?

Solución

Respuesta corta: solo tiene que usar un flotante cuando sabe exactamente lo que está haciendo y por qué.

Respuesta larga: flotantes (a diferencia de dobles ) ya no se usan realmente fuera de las API 3D, que yo sepa. Los flotadores y los dobles tienen las mismas características de rendimiento en las CPU modernas, los dobles son algo más grandes y eso es todo. En caso de duda, solo use doble.

Ah, sí, y utiliza decimal para los cálculos financieros, por supuesto.

Otros consejos

Todos los cálculos de coma flotante son inexactos en un caso general, flota más que el doble. Si desea más información, lea Lo que todo informático debe saber sobre la aritmética de coma flotante

En cuanto a cuándo usar flotadores: a menudo se usan cuando la precisión es menos importante que ahorrar memoria. Por ejemplo, simulaciones simples de partículas en videojuegos.

Primero, nunca use flotantes o dobles si desea representar exactamente los valores decimales; use tipos enteros (int, long, etc.) o decimal (que es solo un tipo entero con un factor de escala). Los flotadores y los dobles se convierten internamente en una representación exponencial en la base 2 y los números representados exactamente en una representación exponencial en la base 10 en general no pueden representarse exactamente. (Por ejemplo, el número 10 solo está representado aproximadamente por flotadores o dobles).

Segundo, en términos de precisión, depende de lo que necesite. No estoy de acuerdo con su opinión de que nunca hay cálculos en los que la precisión no importe. Normalmente tiene una necesidad específica de que su resultado final sea exacto para decir 3 dígitos. No tiene sentido buscar la mayor precisión posible si su entrada tiene una precisión limitada; digamos que pesa unos 5 g de harina y su báscula solo tiene una precisión de 0,5 g. Dicho esto, el cálculo intermedio generalmente se beneficia de una mayor precisión, pero es algo más importante que la alta precisión si a menudo es la velocidad.

Tercero, cuando realiza una serie de cálculos, digamos dentro de un ciclo, necesita saber lo que está haciendo cuando se trata de cálculos inexactos: incurrirá en errores de redondeo y es posible que algunos algoritmos no lleguen a una respuesta. grado de precisión Comprender estos problemas en detalle puede requerir un curso de análisis numérico. Esto no depende de si elige flotadores o dobles para sus cálculos.

Para los cálculos de coma flotante, generalmente iría con dobles ya que son más generales y más rápidos que los flotantes. Sin embargo, los flotadores son más pequeños y si necesita almacenar muchos de ellos, son la opción para evitar problemas de rendimiento debido a errores de caché.

Que yo sepa, el procesamiento de coma flotante es compatible con hardware para dobles pero no flotantes, por lo que el uso de flotantes incurre en una conversión al doble. Sin embargo, algunas rutinas se detendrían antes al calcular un valor de forma iterativa cuando pasa un flotante, ya que esto implica que solo desea unos 8 dígitos de precisión frente a unos 16 para los dobles.

Hay muchos casos en los que desearía usar un float . Sin embargo, lo que no entiendo es lo que puedes usar en su lugar. Si te refieres a usar double en lugar de float , entonces sí, en la mayoría de los casos, quieres hacerlo. Sin embargo, double también tendrá problemas de precisión. Debe usar decimal siempre que la precisión sea importante.

float y double son muy útiles en muchas aplicaciones. decimal es un tipo de datos costoso y su rango (la magnitud del número más grande que puede representar) es menor que double . Las computadoras generalmente tienen soporte de nivel de hardware especial para esos tipos de datos. Se usan mucho en informática científica. Básicamente, son tipos de datos fraccionales primarios que desea usar. Sin embargo, en los cálculos monetarios, donde la precisión es extremadamente importante, decimal es el camino a seguir.

La razón más común que se me ocurre es para ahorrar espacio. No es que esto valga la pena preocuparse, pero en algunos casos es importante. Un flotador ocupa la mitad de la memoria que un doble, por lo que puede obtener el doble en el mismo espacio. Por ejemplo, he tenido una matriz de números que era demasiado grande para caber en la RAM como dobles pero encajaba como una matriz flotante.

De hecho, hay una cosa en la que todavía es común usar flotadores aka " precisión simple " con 32 bits: aplicaciones gráficas e impresión.

La otra razón son las tarjetas gráficas con sus GPU. Cuanto más pequeño es el tipo de datos, más rápido la operación porque se deben transportar menos bits. Los tipos de datos enteros tienen problemas con imágenes de alto rango dinámico: el ojo puede funcionar en un rango de luminosidad de 1: 10 ^ 13 y discierne ca. 4000 niveles. Entonces, si bien los tipos de datos enteros pueden almacenar la cantidad de niveles, no pueden almacenar el brillo del fondo, mientras que los flotadores no tienen problemas con eso. De hecho, IEEE 754R permite una nueva "mitad de precisión". flotador con 16 bits y 10 bits mantisa que pierde algo de precisión pero permitiría una velocidad aún mayor. OpenGL y DirectX, p. use flotadores ampliamente. El ojo es muy indulgente con los artefactos, así que no hay problema.

Todos los demás medios que se basan en gráficos están heredando flotantes como medida conveniente. La mantisa tiene 24 bits, lo que permite 2 ^ 24 = 16,7 millones de pasos consecutivos. Si tiene una impresora con una resolución de 2000 ppp, aún puede imprimir 213x213 m hojas Precisión más que suficiente.

Use flotante para rendimiento y tamaño . Si puede gestionar la pérdida de precisión.

Si bien es cierto que un procesador moderno tarda la misma cantidad de tiempo en procesar operaciones de precisión simple y doble, a veces puede obtener dos veces el rendimiento si usa flotadores con SIMD (MMX / SSE / etc. en x86) instrucciones.

Los

registros SSE tienen 128 bits de ancho y pueden contener 4 flotantes o 2 dobles . Por lo tanto, si se usa correctamente, puede realizar el doble de operaciones con flotadores que con los dobles.

La reducción de tamaño (4 bytes en lugar de 8) se vuelve importante cuando se trata con conjuntos de datos muy grandes (y la reducción de tamaño generalmente mejora el rendimiento también debido al almacenamiento en caché, etc.)

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