¿Por qué los números de coma flotante se usan con frecuencia en Ciencia / Ingeniería?


33

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?



47
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.
Doval

24
Para agregar a los puntos mencionados anteriormente, no solo no le importa la precisión más allá de cierto punto, no puede obtener resultados precisos arbitrariamente porque muchas de sus entradas son cantidades medidas que tienen algún error inherente.

2
También es importante señalar que no es un hecho que los errores de redondeo continúen acumulándose. Depende de lo que esté haciendo y de cómo lo esté haciendo; Hay un campo entero dedicado a eso.
Doval

10
El punto flotante no es "precisión aleatoria", los errores para varias operaciones son predecibles y bien conocidos, y los errores para un algoritmo pueden resolverse. Si son lo suficientemente bajos (y, en particular, si sus errores hacia atrás son más pequeños que las incertidumbres en sus variables de entrada), puede estar seguro de que sus resultados son buenos (o al menos que los problemas con ellos no son causados ​​por flotación- error de punto).
hobbs

Respuestas:


77

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.


2
Buena respuesta. Si bien las funciones subyacentes pueden ser perfectamente continuas, lo que requeriría una precisión perfecta para modelar exactamente, la realidad es que todo en ciencia e ingeniería es una aproximación. Preferiríamos tener aproximaciones decentes y útiles y lograr algo que una precisión infinita, por lo que esperaríamos para siempre para completar muchas operaciones.
Jonathan Eunice

44
@ JonathanEunice No puedes modelar exactamente la realidad. La entrada para el modelo proviene de mediciones y probablemente nunca podrá medir cosas con tanta precisión que un número real nativo en una computadora / software moderno (en ese momento) lo limitaría. En otras palabras, puede tener un modelo perfecto, software o matemático, no importa. Por ejemplo, calcular el volumen de una caja. a*b*ccosas 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.
luk32

2
@ luk32 Estamos violentamente de acuerdo sobre la mayoría de esos puntos. Uno puede modelar algo exactamente (volumen de una esfera, por ejemplo), pero nunca puede medir exactamente. Y la realidad nunca se ajusta perfectamente a un modelo perfecto. Es mejor obtener valores / modelos ligeramente imprecisos y útiles que esperar mediciones o cálculos perfectos, algo que siempre estará a un paso de distancia.
Jonathan Eunice

2
"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". Si te doy mucho tiempo, aún no puedes calcular exactamente porque los algoritmos para calcular exactamente son ampliamente desconocidos. Y antes que nada, ni siquiera podemos representar números exactamente. Este es solo un problema que no sabemos cómo resolver, ni de forma rápida ni lenta.
Michael Le Barbier Grünewald

@ MichaelGrünewald, no podemos representar números reales exactamente, pero podemos resolver los problemas con una aproximación lo suficientemente cercana como para poder construir estructuras a un par de miles de pies de altura, identificar genes en el ADN y encontrar un satélite con un cometa después de dos años en el espacio. Parafraseando a Randy Newman, eso puede no ser exacto, pero está bien. De hecho, podemos representar racionales exactamente utilizando bibliotecas de precisión arbitrarias (sujetas a limitaciones de memoria).
Charles E. Grant

30

¿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.


1
Una de las mejores respuestas, la pasé por alto antes de escribir la mía.
Michael Le Barbier Grünewald

8
Además, existe el hecho un poco inconveniente de que ni siquiera se puede saber si dos reales computables son iguales.
Jörg W Mittag

1
¿No utilizaría todos los reales computables un problema con las comparaciones? Estoy bastante seguro de que no puede comparar reales computables arbitrarios sin resolver el problema de detención.
kasperd

@kasperd: Creo que eso dependería en cierta medida de las operaciones que se le permitiera usar en el cálculo, aunque no estoy seguro de cuán rico podría ser un conjunto de tipos de cómputo y todavía garantizo que dos resultados arbitrarios podrían ser producidos en un número finito de operaciones podrían compararse en un tiempo limitado. Los tipos algebraicos seguramente cumplirían con ese criterio, pero no sé si las funciones ln (x) y exp (x) podrían agregarse y aún cumplirlo.
supercat

Puede admitir aritmética de precisión arbitraria (sumar, multiplicar, restar, dividir), irracionales (como √2), trascendentales bien conocidos (como Pi y e), funciones trigonométricas, etc. utilizando fracciones continuas. Vea el algoritmo de Gosper en HAKMEM. Cuando termine, puede realizar una evaluación diferida para obtener una aproximación de punto flotante a la precisión deseada.
Paul Chernoch

14

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.


@leftaroundabout ¿qué quieres decir con matemáticas (como en matemáticas) no es ciencia? En mi libro lo es.
Pieter B

2
@PieterB: Matemáticas no es ciencia. Es la filosofia. La ciencia es el acto de formar una comprensión de nuestro mundo físico. La filosofía es el acto de comprender cómo funcionan las ideas en un mundo ideal.
slebetman

Creo que la ciencia generalmente prefiere trabajar con rangos de confianza explícitos en lugar de cifras significativas.
Taemyr

@slebetman Además de eso, no tiene nada que ver con mi punto en mi publicación, si las matemáticas son una ciencia o no, no puedo evitar dejar una cita: la naturaleza es matemáticamente innata y nos habla de matemáticas. Solo tenemos que escuchar. Como la naturaleza es matemática, cualquier ciencia que intente describirla depende completamente de las matemáticas. Es imposible enfatizar demasiado este punto, y es por eso que Carl Friedrich Gauss llamó a las matemáticas "la reina de las ciencias".
Pieter B

Esa cita es de aquí . Una buena lectura y mucho para discutir, pero no aquí, ya que de hecho no tiene nada que ver con tu publicación o esta pregunta.
Leftaroundabout

7

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.


6

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.


Todavía no he leído el artículo completo de Kahan, pero parece más educado de lo que yo sería. Java podría haber tenido números que fueron más útiles y funcionaron más rápido de lo que realmente tiene si hubiera agregado un realtipo 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].
supercat

Especifique eso floaty doubleson formatos de almacenamiento, y reales 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.
Supercat

2

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 de Arquímedes, el nombre pedante de π, no es racional.
  • Muchas otras constantes importantes no son racionales.
  • Muchas otras constantes importantes ni siquiera se sabe que son racionales o no.
  • Para cualquier número racional distinto de cero x, el número exp (x) es irracional.
  • Declaraciones similares son válidas para radicales, logaritmos y una gran cantidad de funciones importantes para los científicos (distribución de Gauss, su CDF, funciones de Bessel, funciones de Euler, ...).

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.


Creo que esta es una gran respuesta, solo que no a esta pregunta, en la medida en que no estoy seguro de que el autor de la pregunta entienda los puntos que está haciendo. Eso y usted está siendo bastante simplista con la representación inexacta de \ Real o \ números complejos por una representación digital finita (independientemente del ancho de bits dinámico o estático). Todo eso es completamente cierto, pero aparte del punto. Felicitaciones por no aliado robótico citando a Goldberg. :) Y el teorema de Baire no es parte de la retórica habitual que se encuentra en los Programadores o StackOverflow.
mctylr

0

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í.


0

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.


0

Creo que esto puede responderse abordando para qué tipos de aplicaciones float/ doubledatos 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 floathabí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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.