Действительные числа в компьютере не представимы точно! Это связанно с тем что такие цифры имеют бесконечное число знаков после запятой. А в компьютере числа ограничены размером переменной.
Отсюда имеем множество неожиданных проблем и борьбы за их решения. Также существует целый класс безошибочных численных методов.
Самое первое с чем происходит встречаться это, то перевод из десятичной системы счисления в двоичную.
a:=0.1; if a=0.1 then WriteLn('Равны!') else WriteLn('Не равны!')
см. [1]
Отсюда кстати проблема с переводом числа Pi. В библиотеках для этого его специально корректируют. Поэтому в качестве числа Pi надо использовать внутреннюю константу. Поэтому для сравнения рекомендуется использовать сравнение с допуском. [2]
Также в финансовых расчётах применяются десятичные типы. В качестве примера можно рассмотреть любую БД или СУБД.
От перестановки слагаемых сумма меняется! См. Задача про длину крокодила [3]
Вычисление экспоненты. [4] При нахождение экспоненты используют разложения в ряд Тейллора, но из-за округления решение становиться неточным. Решение становиться неустойчивым.
Быстрое умножение длинных чисел через БПФ. В работах [5],[6] даётся оценка будет ошибка или нет в зависимости от длины чисел и формата чисел.
Обратная матрица. Число обусловленности. Проверка устойчивости решения. [4], [7], [8]
Ранг матрицы. Невозможно точно вычислить из-за ошибок в исходных данных.
Нарушение симметричности матриц.
Малая предсказуемость. Тесты могут не выявить проблемы. Потеря ракеты Ariane 5 [10]
Малые ошибки могут стать большими. Операция деление 1/x переводит малые значения в большие, а большие в маленькие. Из за этого небольшая ошибка в округление может вылиться в большую ошибку.
Проблема устойчивости фильтров. При вычисление из за близости нулей и полюсов решение может оказаться неустойчивым.
Решение навигационной задача Глонасс/GPS. Или определяют координаты объекта при пеленгации. Зная время распространения сигнала от спутника до объекта надо определить координаты объекта. Для решения задачи надо найти пересечения 3 окружностей. Проблема в том что из-за ошибок. 3 окружности никогда точно не пересекутся. Не говоря уже о том если требуется посчитать не от 3 спутников, а от 6-10. Тут ошибки измерения времени и ошибки вызванные округлением.
Решение проблемы является использовать методов минимизации.
Список литературы:
[1] «О чём не пишут в книгах по Delphi»
гл. 3.2 Неочевидные особенности вещественных чисел
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
[2] Модуль для сравнения чисел с допуском. Из книги «Особенности национальной информатики»
http://antosha.com/onzi/modules/geometry.zip
[3] Задача про длину крокодила. Примерно на 54 минуте.
http://www.intuit.ru/studies/courses/586/442/lecture/5556
[4] Каханер,_Моулер,_Наш.-Численные_методы_и_программное_обеспечение-Мир(1998)
[5] C. Percival, Rapid multiplication modulo the sum and dierence of highly composite numbers,
Math. Comp. 72 (2003), 387{395.
[6] C. Percival, roots.c, in TRICL,(2005) http://www.daemonology.net/tricl/roots_c.pdf.
[7]
[10] http://www.intel.com/standards/floatingpoint.pdf
[11] Много случаев ошибок http://softelectro.ru/ieee754.html