Mientras investigaba la precisión de los números de coma flotante, he visto en algunos lugares una declaración similar a
" flotante y doble son ( diseñados para / utilizados a menudo en ) ingeniería y cálculo científico "
Según tengo entendido, la fuerza de los flotadores y los dobles es la cantidad de memoria que usan para su precisión (buena, pero no perfecta).
Siento que casi estoy entendiendo esta respuesta
"los números de coma flotante le permiten modelar cantidades continuas"
Todavía no estoy convencido de entender. Tanto la ingeniería como la ciencia parecen campos en los que desearía obtener resultados precisos de sus cálculos, que, según tengo entendido, los puntos flotantes no dan. Tampoco estoy seguro de seguir exactamente lo que es una "cantidad continua".
¿Alguien puede ampliar esta explicación y tal vez dar un ejemplo?
fuente
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.
Tanto en Ciencia como en Ingeniería solo te importa la precisión hasta cierto punto. Usar precisión infinita para cada cálculo a menudo es innecesariamente costoso. Lo que diferencia al punto flotante del punto fijo es que no tiene que comprometerse con un cierto número de decimales: puede tener cantidades realmente pequeñas con muchos decimales o cantidades realmente grandes con precisión limitada.Respuestas:
La computación en ciencia e ingeniería requiere compensaciones en precisión, rango y velocidad. La aritmética de punto fijo proporciona precisión y velocidad decente, pero sacrifica el rango. BigNum, bibliotecas arbitrarias de precisión, ganan en rango y precisión, pero pierden velocidad.
El quid de la cuestión es que la mayoría de los cálculos científicos y de ingeniería necesitan alta velocidad y un amplio rango, pero tienen necesidades de precisión relativamente modestas. La constante física mejor determinada solo se conoce con unos 13 dígitos, y muchos valores se conocen con mucha menos certeza. Tener más de 13 dígitos de precisión en la computadora no ayudará. La mosca en la pomada es que las secuencias de operaciones de coma flotante pueden perder precisión gradualmente. La esencia del análisis numérico es descubrir qué problemas son particularmente susceptibles a esto, y descubrir formas inteligentes de reorganizar la secuencia de operaciones para reducir el problema.
Una excepción a esto es la teoría de números en matemáticas que necesita realizar operaciones aritméticas en números con millones de dígitos pero con absoluta precisión. Los teóricos de números numéricos a menudo usan bibliotecas BigNum, y soportan sus cálculos tomando mucho tiempo.
fuente
a*b*c
cosas fáciles, sin embargo, necesita medir las dimensiones que no puede hacer con absoluta certeza, por lo que no necesita una precisión infinita de cálculo de todos modos, solo lo suficiente como para estar limitado por un error de medición.¿Qué alternativa propones?
Las cantidades continuas se representan usando números reales en matemáticas. No hay ningún tipo de datos que pueda codificar todos los números reales posibles (porque los reales son incontables), lo que significa que solo podemos elegir un subconjunto de esos números reales en los que estamos más interesados.
Puede elegir todos los reales computables, que es similar a lo que hacen los sistemas de álgebra computacional (CAS). El problema es que se vuelve rápidamente inviable a medida que su árbol de expresión se hace más y más grande. También es muy lento: intente resolver un gran sistema de ecuaciones diferenciales en Mathematica simbólicamente y compárelo con alguna otra implementación basada en coma flotante y verá una diferencia dramática en la velocidad. Además, como Jörg W Mittag y kasperd han señalado: ni siquiera tiene operaciones decididas de igualdad / comparación.
Podría usar números racionales exactos, pero eso realmente no funciona para muchas aplicaciones porque necesita calcular raíces cuadradas o cosenos o logaritmos, etc. Además, también existe una tendencia a que los racionales se vuelvan cada vez más complejos y, por lo tanto, requieren más espacio para almacenar y tiempo para procesar a medida que realiza más y más cálculos sobre ellos.
También podría usar decimales de precisión arbitraria, pero incluso algo tan simple como la división no funcionará porque obtendrá dígitos que se repiten infinitamente. También puede toparse con el problema de la complejidad creciente a medida que realiza más similares a los números racionales, aunque en menor medida.
Por lo tanto, se vería obligado a usar aproximaciones en algún momento, en cuyo caso es exactamente donde los números de punto flotante funcionan mejor. Los números de punto flotante también son de ancho fijo (a diferencia de los otros 3 tipos de datos mencionados anteriormente), lo que evita que la complejidad aumente a medida que realiza más y más cálculos sobre ellos.
fuente
Su propuesta acerca de la ciencia es incorrecta, la ingeniería y la ciencia además de las matemáticas no funcionan con resultados exactos y precisos. Funcionan con un factor de precisión que está integrado en la cantidad de dígitos que muestra.
El término clave que necesita comprender aquí es: cifras significativas . Las cifras significativas de un número son aquellos dígitos que tienen un significado que contribuye a su precisión.
Lo que básicamente significa que si afirmo que algo tiene 12 centímetros de largo, en realidad puede tener entre 11,5 y 12,5 centímetros de largo. Sin embargo, si afirmo que algo tiene 12,00 centímetros de largo, puede tener entre 11,995 y 12,005 centímetros de largo.
Solo como una ilustración, si toma una cinta métrica y mide su sala de estar. Aunque puede encontrar que mide 6 metros y 25 centímetros de ancho, sabe que la medición de su cinta no fue lo suficientemente precisa como para decir algo sobre la precisión milimétrica o la precisión nanométrica.
fuente
Tenga en cuenta que los números de coma flotante son básicamente lo mismo que la notación científica y de ingeniería , la forma estándar para que los humanos escriban números en matemáticas y ciencias. En estos campos, no hay una gran necesidad de precisión extrema, pero a menudo hay una gran variedad.
Para elegir un ejemplo aleatorio de mi tarea de física, recientemente tuve que trabajar con la masa de un electrón, que es aproximadamente 9.11 * 10 ^ -31 kg. No me importa mucho la precisión; fácilmente podría ser 9.12 para todo lo que me importa. Pero me importa el exponente y no quiero tener que escribir 0.0000 ... 911 kg, así que uso notación científica.
Se aplica un razonamiento similar en la informática científica y de ingeniería: hay una gran variedad, pero no queremos tener que almacenar y trabajar con números muy grandes, por lo que almacenamos un valor normalizado y un exponente, que es más pequeño y más rápido para trabajar.
fuente
Los números de punto flotante también tienen varias propiedades que se prestan bien para calcular ciertos tipos de resultados científicos. En particular, la precisión es inversamente proporcional a la magnitud, al igual que en la notación científica, por lo que puede representar tanto pequeñas diferencias cercanas a cero como diferencias más grandes mucho más lejos.
El artículo de Goldberg es probablemente el análisis más famoso de las propiedades de los números de coma flotante (y debería ser necesario leerlo si te interesa este tipo de cosas), pero creo que los documentos de Kahan hacen un mejor trabajo al explicar la razón detrás de muchos de los sutiles problemas de diseño.
En particular, la diatriba de Kahan sobre la implementación de Java de punto flotante , aunque bastante inflamatoria, hace varios puntos buenos acerca de por qué la semántica IEEE-754 es útil, y Bit de signo de Mucho ruido y pocas nueces explora la lógica del cero con signo en una profundidad considerable.
fuente
real
tipo que tomaría tres entradas de pila para almacenar, y representaría la precisión computacional natural de la máquina; el valor podría almacenarse como un relleno flotante de 80 bits + 16 bits, un relleno flotante de 64 bits + 32 bits, o una mantisa de 64 bits, un exponente de 16 bits y 16 bits para signos e indicadores [para implementaciones que no sean FPU].float
ydouble
son formatos de almacenamiento, yreal
es el formato computacional. En muchos sistemas sin FPU, trabajar con una mantisa, un exponente y banderas que están en los límites de palabras y medias palabras sería más rápido que tener que desempaquetar y reempacar los dobles con cada operación.TL; DR No sabemos cómo calcular la mayoría de las funciones con precisión perfecta, por lo tanto, no hay ningún punto que represente números con precisión perfecta.
Todas las respuestas hasta ahora pierden el punto más importante: no podemos calcular los valores exactos de la mayoría de los números. Como un caso especial importante, no podemos calcular valores exactos de la función exponencial, para citar solo la función irracional más importante.
Respuesta ingenua a la pregunta ingenua
Parece que su pregunta es más bien "hay bibliotecas aritméticas exactas, ¿por qué no las usamos en lugar de la aritmética de coma flotante?" La respuesta es que la aritmética exacta funciona con números racionales y que:
El número racional es un accidente afortunado. La mayoría de los números no son racionales (véase el teorema de Baire), por lo que calcular los números siempre nos sacará del mundo racional.
¿Qué es calcular y representar un número?
Podemos reaccionar diciendo "OK, el problema es que los números racionales no fueron una gran elección para representar números reales". Luego, enrollamos nuestras horquillas en Debian y diseñamos un nuevo sistema de representación para números reales.
Si queremos calcular números, debemos elegir un sistema de representación para números reales y describir operaciones importantes en ellos, es decir, definir qué significa computación . Como estamos interesados en la informática científica, queremos representar con precisión todos los números decimales (nuestras medidas), sus cocientes (números racionales), los valores de las funciones exponenciales y algunas constantes divertidas, como el número de Archimede.
El problema es que la única forma de representar perfectamente los números en un sistema de este tipo es usar una forma simbólica, es decir, no calcular nada y trabajar con expresiones algebraicas. Esta es una representación bastante inválida de números reales, porque no podemos comparar de manera confiable dos números (¿cuál es mayor)? Ni siquiera podemos responder fácilmente a la pregunta "¿Es el número dado igual a 0?".
Si busca definiciones y problemas matemáticos más precisos, busque números racionales, números trascendentales, mejores aproximaciones y el teorema de Baire, por ejemplo.
fuente
Porque
1) Los autores suponen que el "cálculo científico y de ingeniería" mide cantidades físicas del mundo real
2) Las cantidades físicas son continuas, y exactamente como dice "los números de coma flotante le permiten modelar cantidades continuas"
... y Rufflewind resume muy bien el resto de mi respuesta , así que no voy a repetir eso aquí.
fuente
Los números de coma flotante proporcionan una precisión relativa: pueden representar números que son, como máximo, un pequeño porcentaje (si desea llamar a algo como 0.0000000000001% porcentual) lejos de cualquier número exacto en un amplio rango de números. Comparten este rasgo con una regla de cálculo, aunque este último no mejora mejor que algo así como 3 dígitos de precisión. Aún así, fue suficiente para resolver las fuerzas estáticas y dinámicas de las grandes estructuras antes de que las computadoras digitales se volvieran comunes para eso, y eso se debe a que las constantes materiales también muestran alguna variación, y la elección de construcciones que sean razonablemente benignas contra el material y las diferencias de construcción tenderá para hacer que las cargas máximas y los puntos débiles sean razonablemente identificables.
Ahora "precisión" es una característica útil para muchos números que representan medidas y / o magnitudes de propiedades físicas.
No todo en ciencia / ingeniería pertenece a esa categoría. Por ejemplo, si está utilizando transformaciones teóricas de números para multiplicar números grandes o campos de Galois para manipular polinomios de corrección de errores, no existe un error pequeño: cualquier error de un solo bit durante el procesamiento conducirá a resultados que son bastante indistinguibles de completamente aleatorios ruido.
Incluso en esas áreas, se puede trabajar con números de coma flotante (como el uso de FFT complejas para hacer convolución) si se realiza un seguimiento de la acumulación de errores y se asegura de que los errores de coma flotante no acumulen suficiente magnitud para posiblemente incluso voltear un solo bit las entidades reales de las que son aproximaciones. Para tales aproximaciones, el procesamiento de punto fijo probablemente sería más apropiado, pero las unidades de punto flotante en el campo tienden a proporcionar una operación más rápida y un mayor número de bits utilizables.
Además, los lenguajes de programación como C o Fortran hacen que sea sorprendentemente difícil acceder a operaciones básicas como la multiplicación y división de precisión mixta o un bit de acarreo para suma / resta, y esos son bloques de construcción básicos para ir más allá de los enteros de precisión limitada.
Entonces, si puede asignar operaciones a números de coma flotante, tiende a tener hardware razonablemente potente a su disposición en estos días y puede especificar razonablemente sus algoritmos en uno de los lenguajes de programación de uso general de hoy en día.
fuente
Creo que esto puede responderse abordando para qué tipos de aplicaciones
float
/double
datos no son adecuados.Cuando necesita asegurarse de que puede representar un número con precisión con un número específico de dígitos, entonces los números de coma flotante son inapropiados, porque representan los números como potencias de 2, en lugar de potencias de 10, como es como representamos números en el mundo real.
Entonces, un dominio en el que no se deben usar tipos de datos de coma flotante es el de finanzas *. Para el sistema central de, por ejemplo, un banco, sería completamente inaceptable si una cantidad que debería haber sido $ 100000.01 de repente se convierte en $ 100000.00 o $ 100000.02.
Tal problema podría ocurrir fácilmente cuando se usan flotadores, especialmente si el número fue el resultado de uno o más cálculos, por ejemplo, calcular la suma de todas las transacciones en una cuenta.
Los cálculos de ingeniería y científicos son dominios donde estos errores de redondeo relativamente pequeños son aceptables. Los usuarios normalmente son conscientes de que todos los números tienen una precisión limitada y, a menudo, trabajan con varios dígitos significativos . Pero lo más importante es que tienen una precisión relativa bien definida, es decir, han proporcionado el mismo número de dígitos significativos, tanto para números muy grandes como para números muy pequeños.
* Una vez trabajé en una aplicación financiera donde se
float
habían usado s para representar valores, y como consecuencia, se introdujeron errores de redondeo. Afortunadamente, este error específico no fue crítico en absoluto, los usuarios se quejaron de los errores de cálculo en el programa. Y esto condujo a un efecto diferente, mucho peor: los usuarios comenzaron a perder la fe en el sistema.fuente