if (abs (a-b) < EPS) . . .
Eles ingenuamente escolheram o mesmo número 1e-8 para todos os seus projetos, criando um local potencial para erros graves. Além disso, eles tentaram comparar duas duplas como esta:
if (a < b) . . .
sem entender porque eu os repreendi quando vi tal absurdo. Eu nem estou falando sobre o horror que uma constante como 0x400921fb54442d18 poderia causar (apenas um número ) que pode ser visto em alguns programas mais antigos ou na tela do depurador.

Já no processo de depuração, um colega descobriu que a expressão com double não muda quando tenta somar dois números, e então começou a pecar por um erro no compilador ou depurador, até que expliquei em quais casos a soma dos dois números permanecerá igual a apenas um dos termos ...
Truques de troca de números também são assustadores para muitos, e no StackOverflow eu sempre vi perguntas perplexas de usuários sobre por que uma pequena mudança em uma expressão leva a resultados diferentes e por que a otimização de código pode levar a uma resposta completamente errada. Certa vez, um dos usuários afirmou claramente que encontrou um erro no processador ao converter um número inteiro de 64 bits em um número de dupla precisão e, em seguida, de volta - e obteve outro número. Ele aparentemente não sabia como pelo menos 11 bits são perdidos com tal conversão. E essa ignorância é encontrada mesmo entre aqueles que têm certeza de que ele simplesmente sabe como tudo funciona.
Mesmo em Habré, você costuma encontrar artigos em que os autores "expõem" o comportamento incompreensível dos números de ponto flutuante e fazem de sua descoberta algo novo e desconhecido, não óbvio e misterioso. É estranho ver tais artigos escritos por programadores aparentemente profissionais. Não vou publicá-los, por favor, procure você mesmo.
Parece que vários materiais de treinamento devem resolver o problema, mas não. Via de regra, o leitor se assusta com fórmulas e palavras incompreensíveis que o autor imediatamente lança sobre ele: número normalizado , unidade oculta , expoente tendencioso- e então, sem explicar as razões pelas quais esta ou aquela solução apareceu na Norma IEEE-754, uma apresentação seca da teoria começa. Aulas em vídeo sobre esse tema também não brilham com a variedade: todos parecem estar analisando o mesmo exemplo primitivo, onde tudo sai de forma rápida e bonita ... e o aluno nunca vai adivinhar que quase 100% dos compiladores trabalham com aritmética flutuante com erros. Isso é compreensível, esses próprios professores não sabem o que está vindo e como funciona e, portanto, apenas dizem o que eles próprios entendem, e é bastante óbvio que eles próprios descobriram ontem o mundo da aritmética de ponto flutuante, mas já estão confusos com pressa falar sobre ele. Eu não julgo, mas acho que tal comportamento em público é inaceitável.
Então decidi tentar consertar a situação e criei de certa formatentativascurso de treinamento. Este é um curso de vídeo que mergulha suavemente o espectador no mundo da aritmética de ponto flutuante. Nas primeiras quatro lições, examinamos o sistema de numeração decimal e como as circunstâncias nos forçam a criar um ou outro sistema de números, chegando finalmente a um sistema de ponto flutuante nesta forma. De onde vem a normalização e por que ela é necessária? De onde vem o problema de associatividade? Como e por que a precisão é perdida e o que fazer a respeito? O que é absolutamente proibido fazer e por quê? Por que os números desnormalizados aparecem em tal sistema e o que é em geral? Em seguida, as próximas 4 lições mostram como todo esse conhecimento se encaixa perfeitamente na aritmética binária e de onde vem a ideia do bit oculto. Quando a primeira "fórmula terrível" aparece na tela,o espectador já tem a imagem necessária da aritmética de ponto flutuante em sua cabeça e compreende facilmente a lógica de tal fórmula ... claro, se ele executou os exercícios corretamente. Todas essas 8 lições são a primeira parte do curso, é para iniciantes. O segundo será para programadores avançados e está em desenvolvimento.
Por que vídeo e não texto? A explicação é simples: tentei vários formatos e achei difícil para iniciantes ler. Quem sabe ler com atenção vai abrir o livro didático e ler o texto com fórmulas, entender e entender. Para quem tem dificuldade de leitura, tem medo de coisas difíceis e acham mais fácil estudar o material durante uma xícara de chá, a imersão suave em formato de vídeo com narração é adequada. Bastante água? Sim, é possível, mas o curso é voltado até para quem quer se programar, mas não era amigo da matemática na escola. Portanto, o que "água" para você não é água, mas o que você já sabe bem da escola, e muitos dos meus alunos não sabem. Seja condescendente com eles, todos nós começamos de algum lugar. E o vídeo também pode ser visto como uma preparação para a leitura de livros didáticos sérios. Concordo, é bom quando você abre um livro e entende o que está escrito nele muito mais rápido,pois a imagem desejada já está na cabeça.
Sobre mim: ex-professor profissional, trabalhei 11 anos em universidade, lecionava matemática e programação, nos últimos anos tenho desenvolvido bibliotecas de matemática para computação de alto desempenho. Eu entendo bem o que meu público-alvo deseja, e eu entendo bem o que está em demanda sobre esse assunto no mundo da programação e, portanto, acredito que tenho o direito de criar esses cursos, e você pode ver por si mesmo que palestras semelhantes em qualidade (em termos de conteúdo ) sobre você não encontrará russo agora. Confira! As primeiras quatro lições, com as quais você já aprenderá muitas coisas interessantes, são totalmente gratuitas. Se quiser, você pode ver o resto, eles são ainda mais interessantes, mas são pagos. O trabalho de outra pessoa deve ser respeitado: eu não souEu vendo conhecimento, mas preciso de apoio para continuar meu trabalho educacional, então meu tempo vale dinheiro. Em geral, você pode tirar conclusões sobre a qualidade do meu trabalho de meus outros artigos sobre Habré.
Para aqueles que entrarão em nossa comunidade VK, posso oferecer um desconto de 50% se você entrar em contato com o PM. Por favor, cadastre-se na ZealComputing School (é grátis) e assista às primeiras 4 aulas. Ou eles estão no YouTube (o primeiro está aqui - e mais adiante nos links da descrição). Sim, você não precisa assistir ao vídeo introdutório para o qual estou vinculado, é apenas um anúncio.
Resumo das aulas pagas
Lição no. 5 : vamos passar para o sistema numérico binário pela primeira vez. Construímos um modelo bonito e simples de ponto flutuante de 6 bits que está muito próximo do formato IEEE-754. Esta é a lição mais importante e difícil. As quatro lições anteriores foram projetadas para mostrar de onde certas coisas vêm na aritmética de ponto flutuante, e agora você entende como essas coisas aparecem lindamente no formato IEEE-754 usando um exemplo de brinquedo e compreensível.
Lição número 6: Apresentando arredondamento. Não é tão óbvio como na matemática usual. Você aprenderá o que é difícil de ver nos exemplos mais simples dados por outros professores de vídeo. Ou seja, às vezes é difícil converter um número do sistema numérico decimal para o formato IEEE-754 tanto que alguns compiladores não conseguem fazer isso corretamente. Vou explicar em detalhes por que tudo é tão simples na teoria, mas não na prática.
Lição número 7: Aqui você domina totalmente os formatos binary32 e binary64 (float e double), mostra como você pode exibir a representação de bits de números em C ++ (em outras linguagens também é possível, mas não em todos, eu indico você ao Google ou Yandex e mostro como é simples, por exemplo, encontre uma solução Java). Após esta lição, a estrutura dos números de ponto flutuante (se você fez bem os exercícios) é completamente clara para você e não pode levantar questões que não foram respondidas nas lições anteriores.
Lição número 8: Um guia prático para usar a aritmética de ponto flutuante. Algumas das características já descritas e novos pontos: a perda de comutatividade, associatividade, manifestações inesperadas da chamada "equanimidade". E a dica mais importante! Este conselho o ajudará a evitar quase 100% de todos os erros em tarefas não críticas típicas. Em seguida, vem a discussão do erro de arredondamento duplo, a perda catastrófica de algarismos significativos: quando e como ocorre. Em geral, todas as práticas simples que não requerem matemática avançada são descritas nesta lição.
O que mais está incluído no curso? E nada mais é necessário! Você pode me fazer perguntas sobre as aulas, mas tenho certeza de que não surgirão. Cada lição contém exercícios abrangentes com respostas, portanto minha participação em geral não é obrigatória, daí o preço baixo. Um curso completo com instrutor, comunicação, workshop orientado e palestras ao vivo custaria dez vezes mais.
Bom aprendizado!