Действительные числа в компьютере не представимы точно! Это связанно с тем что такие цифры имеют бесконечное число знаков после запятой. А в компьютере числа ограничены размером переменной.

Отсюда имеем множество неожиданных проблем и борьбы за их решения. Также существует целый класс безошибочных численных методов.

Пример 1

Самое первое с чем происходит встречаться это, то перевод из десятичной системы счисления в двоичную.

a:=0.1;
if a=0.1 then WriteLn('Равны!')
 else WriteLn('Не равны!')

см. [1]

Отсюда кстати проблема с переводом числа Pi. В библиотеках для этого его специально корректируют. Поэтому в качестве числа Pi надо использовать внутреннюю константу. Поэтому для сравнения рекомендуется использовать сравнение с допуском. [2]

Также в финансовых расчётах применяются десятичные типы. В качестве примера можно рассмотреть любую БД или СУБД.

Пример 2

От перестановки слагаемых сумма меняется! См. Задача про длину крокодила [3]

Пример 3

Вычисление экспоненты. [4] При нахождение экспоненты используют разложения в ряд Тейллора, но из-за округления решение становиться неточным. Решение становиться неустойчивым.

Пример 4

Быстрое умножение длинных чисел через БПФ. В работах [5],[6] даётся оценка будет ошибка или нет в зависимости от длины чисел и формата чисел.

Пример 4

Обратная матрица. Число обусловленности. Проверка устойчивости решения. [4], [7], [8]

Пример 5

Ранг матрицы. Невозможно точно вычислить из-за ошибок в исходных данных.

Пример 6

Нарушение симметричности матриц.

Пример 7

Малая предсказуемость. Тесты могут не выявить проблемы. Потеря ракеты Ariane 5 [10]

Пример 8

Малые ошибки могут стать большими. Операция деление 1/x переводит малые значения в большие, а большие в маленькие. Из за этого небольшая ошибка в округление может вылиться в большую ошибку.

Пример 9

Проблема устойчивости фильтров. При вычисление из за близости нулей и полюсов решение может оказаться неустойчивым.

Пример 10

Решение навигационной задача Глонасс/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

 
articles/ошибки_в_численных_методах.txt · Последние изменения: 2013/10/26 18:53 От Pavia
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki