green_fr: (Default)
green_fr ([personal profile] green_fr) wrote2012-06-01 05:31 pm
Entry tags:

Точность превыше всего!

На работе использую программу для генерирования экономических сценариев (B+H ESG), при определённой конфигурации она вылетает с нечитаемой ошибкой. Hotline объясняет, что у меня данные неправильные, моя матрица должна быть положительно полуопределённой, бла-бла-бла.

Я проверяю — одно из собственных значений выходит −2E-16.
Формально да, отрицательное. Но мы все понимаем, что это ноль, проблема округления (более того, я могу с ручкой на бумажке доказать, что это ноль, я намеренно сделал вырожденную матрицу, мне так надо).

Весь день бодаюсь теперь с hotline’ом по почте, доказывая, что это не «extremely high degree of accuracy in calculations» (цитата из их ответа), а баг, требующий патча. Ищу понятные аргументы...

Update: победили, ошибку признали, постараются когда-нибудь починить, но уже точно не успеют к следующей (7.3.0) версии.

[identity profile] dmpogo.livejournal.com 2012-06-01 05:34 pm (UTC)(link)
Не обязательно сработает. Точнее сработает но ответ может быть с мусорком, поскольку обращение (в зависимости от алгоритма) будет зависить от 'machine precision' если епсилон мало (а 10^-15 очень близко к double precision), и менять результат если велико. По честному тут надо прогнать несколько значений добавленного малого числа и посмотреть что ответ не зависит.

[identity profile] green-fr.livejournal.com 2012-06-01 09:23 pm (UTC)(link)
Это double precision на величинах порядка единицы, она там относительная. Это моя любимая иллюстрация проблемы округления, перед написанием поста показывал своим коллегам (они ни разу не программисты, они не в курсе), что
1E-50 + 1 - 1
Это совсем не то же самое, что
1E-50 + (1 - 1)
Так чт надо ещё в голове держаить абсолютные величины, но я как раз с процентами работаю, там всё порядка единицы крутится, поэтому и бросаются в глаза "родные" 1E-15.