Video tutorial de aritmética de punto flotante IEEE-754. Parte I

La aritmética de coma flotante no es bien conocida por todos los programadores. Anteriormente, trabajé en varias firmas de TI y me sorprendió descubrir que incluso los programadores experimentados se pierden cuando surge la tarea de seleccionar para comparar dos números de punto flotante en un código como este:ε



if (abs (a-b) < EPS) . . .
      
      





Ingenuamente eligieron el mismo número 1e-8 para todos sus proyectos, creando un lugar potencial para errores graves. Además, intentaron comparar dos dobles así:



if (a < b) . . .
      
      





sin entender por qué los regañé cuando vi tales tonterías. Ni siquiera estoy hablando del horror, una constante como 0x400921fb54442d18 (solo un número ) que se puede ver en algunos programas antiguos o en la pantalla del depurador.π











Una vez en proceso de depuración, un colega descubrió que la expresión con doble no cambia cuando intenta sumar dos números, y luego comenzó a pecar por un error en el compilador o depurador, hasta que expliqué en qué casos la suma de dos números seguirá siendo igual a solo uno de los términos ...



Los trucos de intercambio de números también dan miedo a muchos, y en StackOverflow a menudo vi preguntas desconcertadas de los usuarios sobre por qué un pequeño cambio en una expresión conduce a resultados diferentes y por qué la optimización del código puede conducir a una respuesta completamente incorrecta. Una vez, uno de los usuarios declaró intencionadamente que encontró un error en el procesador cuando convirtió un número entero de 64 bits a un número de doble precisión, luego lo regresó y obtuvo otro número. Al parecer, no sabía cómo se pierden al menos 11 bits con tal conversión. Y tal ignorancia se encuentra incluso entre aquellos que están seguros de que él simplemente sabe cómo funciona todo.



Incluso en Habré, a menudo hay artículos en los que los autores "exponen" el comportamiento incomprensible de los números de coma flotante y hacen pasar su descubrimiento como algo nuevo y desconocido, no obvio y misterioso. Es extraño ver estos artículos escritos por programadores aparentemente profesionales. No los daré a conocer, búsquelos usted mismo.



Parecería que varios materiales de formación deberían resolver el problema, pero no. Como regla general, el lector se asusta con fórmulas y palabras incomprensibles, que el autor le lanza de inmediato: número normalizado , unidad oculta , exponente sesgado- y luego, sin explicar las razones por las que esta o aquella solución apareció en el Estándar IEEE-754, comienza una seca presentación de la teoría. Las videoconferencias sobre este tema tampoco brillan con variedad: todos parecen estar analizando el mismo ejemplo primitivo, donde todo resulta rápido y hermoso ... y el alumno nunca adivinará que casi el 100% de los compiladores trabajan con aritmética flotante con errores. Esto es comprensible, tales maestros mismos no saben de qué proviene y cómo funciona, y por lo tanto solo dicen lo que ellos mismos entienden, y es bastante obvio que ellos mismos solo ayer descubrieron el mundo de la aritmética de punto flotante, pero ya tienen prisa y están confundidos. hablar de él. No juzgo, pero creo que ese comportamiento en público es inaceptable.



Así que decidí intentar arreglar la situación y en cierto sentido creéjuiciocurso de entrenamiento. Este es un curso en video que sumerge suavemente al espectador en el mundo de la aritmética de punto flotante. Las primeras cuatro lecciones analizamos el sistema numérico decimal y cómo las circunstancias nos obligan a crear uno u otro sistema de números, llegando finalmente al sistema de punto flotante en esta forma. ¿De dónde viene la normalización y por qué es necesaria? ¿De dónde viene el problema de la asociatividad? ¿Cómo y por qué se pierde la precisión y qué hacer al respecto? ¿Qué está absolutamente prohibido hacer y por qué? ¿Por qué aparecen números desnormalizados en un sistema así y qué es en general? Luego, las siguientes 4 lecciones muestran cómo todo este conocimiento encaja perfectamente en la aritmética binaria y de dónde proviene la idea del bit oculto. Cuando aparece la primera "fórmula terrible" en la pantalla,el espectador ya tiene la imagen necesaria de la aritmética de punto flotante en su cabeza y entiende fácilmente la lógica de tal fórmula ... por supuesto, si realizó los ejercicios correctamente. Todas estas 8 lecciones son la primera parte del curso, es para principiantes. El segundo será para programadores avanzados y actualmente está en desarrollo.



¿Por qué video y no texto? La explicación es simple: probé diferentes formatos y me resultó difícil de leer para los principiantes. Quien sepa leer con atención abrirá el libro de texto y leerá el texto con fórmulas, comprenderá y comprenderá. Para aquellos a los que les resulta difícil leer, a quienes les asustan las cosas difíciles y a quienes les resulta más fácil estudiar el material con una taza de té, la inmersión suave en formato de video con locución es adecuada. ¿Mucha agua? Sí, es posible, pero el curso está diseñado incluso para aquellas personas que quieren programar, pero que no eran amigos de las matemáticas en la escuela. Por tanto, lo que para ti "agua" no es agua, sino lo que ya sabes bien de la escuela, y muchos de mis alumnos no. Sea condescendiente con ellos, todos comenzamos en alguna parte. Y el video también puede verse como una preparación para leer libros de texto serios. De acuerdo, es bueno cuando abres un libro de texto y entiendes lo que está escrito mucho más rápido,ya que la imagen deseada ya está en la cabeza.



Acerca de mí: ex profesor profesional, 11 años trabajando en una universidad, enseñé matemáticas y programación, en los últimos años he estado desarrollando bibliotecas matemáticas para computación de alto rendimiento. Entiendo bien lo que quiere mi público objetivo, y entiendo bien lo que se demanda sobre este tema en el mundo de la programación y, por lo tanto, creo que tengo derecho a crear tales cursos, y pueden ver por sí mismos que conferencias similares en calidad (en términos de contenido ) sobre ahora no encontrarás ruso. ¡Echale un vistazo! Las primeras cuatro lecciones, de las que ya aprenderá muchas cosas interesantes, son completamente gratuitas. Si quieres, puedes pasar por el resto, son aún más interesantes, pero por una tarifa. El trabajo de otra persona debe ser respetado: no soyVendo conocimiento, pero necesito apoyo para continuar mi trabajo educativo, por lo que mi tiempo vale dinero. En general, puedes sacar conclusiones sobre la calidad de mi trabajo de mis otros artículos sobre Habré.



Para aquellos que se unen a nuestra comunidad VK, puedo ofrecer un descuento del 50% si se comunica con el PM. Por favor, registrarse con la Escuela ZealComputing (es gratis) y ver las primeras 4 clases. O están en YouTube (el primero está aquí , y más adelante en los enlaces de la descripción). Sí, no es necesario que veas el video introductorio al que enlazo, es solo un anuncio.



Resumen de lecciones pagadas



Lección # 5 : Pasemos al sistema numérico binario por primera vez. Creamos un modelo de punto flotante de 6 bits hermoso y simple que se acerca mucho al formato IEEE-754. Ésta es la lección más importante y más difícil. Las cuatro lecciones anteriores fueron diseñadas para mostrar de dónde provienen ciertas cosas en aritmética de punto flotante, y ahora comprende cómo estas cosas se ven maravillosamente en el formato IEEE-754 usando un juguete y un ejemplo comprensible.



Lección número 6: Introducción al redondeo. No es tan obvio como en las matemáticas habituales. Aprenderá lo que es difícil de ver en los ejemplos más simples proporcionados por otros profesores de video. Es decir, a veces es tan difícil convertir un número del sistema numérico decimal al formato IEEE-754 que algunos compiladores no pueden hacerlo correctamente. Explicaré en detalle por qué todo es tan simple en teoría, pero no en la práctica.



Lección número 7: Aquí dominas por completo los formatos binary32 y binary64 (float y double), muestra cómo puedes mostrar la representación de bits de números en C ++ (en otros idiomas también es posible, pero no en todos, allí te remito a Google o Yandex y te muestro lo simple que es, por ejemplo, busque una solución Java). Después de esta lección, la estructura de los números de punto flotante (si hizo bien los ejercicios) es completamente clara para usted y no puede plantear preguntas que no fueron respondidas en las lecciones anteriores.



Lección número 8: Una guía práctica para usar la aritmética de coma flotante. Algunas de las características y nuevos momentos ya descritos: pérdida de conmutatividad, asociatividad, manifestaciones inesperadas de la llamada "ecuanimidad". ¡Y el consejo más importante! Este consejo le ayudará a evitar casi el 100% de todos los errores en las tareas típicas no críticas. Luego viene la discusión del doble error de redondeo, la pérdida catastrófica de cifras significativas: cuándo y cómo ocurre. En general, en esta lección se describen todas las prácticas simples que no requieren matemáticas avanzadas.



¿Qué más se incluye en el curso? ¡Y no se necesita nada más! Puede hacerme preguntas sobre las lecciones, pero estoy seguro de que no surgirán. Cada lección contiene ejercicios completos con respuestas, por lo que mi participación en general no es necesaria, de ahí el bajo precio. Un curso completo con instructor, comunicación, taller con mentores y conferencias en vivo costaría diez veces más.



¡Feliz aprendizaje!



All Articles