Различия в точности в Matlab и C++

Я пытаюсь проверить эквивалентность алгоритма, написанного на C++ и в Matlab. Алгоритм содержит некоторую петлю во времени и выполняется более 1000 раз. Он имеет арифметические операции и некоторые математические функции.

Я передаю начальные входные данные обеим платформам вручную (например, a=1,767, b=6,65, ...), и когда я проверяю шестнадцатеричные представления этих входных данных, они совпадают. Так что проблем с вводом нет. И получить выходные данные С++ для Matlab текстовым файлом с 16 десятичными цифрами. (я использую оператор "setprecision(32)")

Но здесь возникает проблема; хотя после 614-го шага обоих кодов все результаты абсолютно одинаковы, на 615-м шаге я получаю разницу примерно 2.xxx..xxe-19? И после этого шага ошибка становится все больше и больше, и в конце прогонов она составляет около 5.xx..xxe-14.

0x3ff1 3e42 a211 6cca--->[функция C++]--->0x3ff4 7619 7005 5a42

0x3ff1 3e42 a211 6cca--->[функция MATLAB]--->ans

ans - 0x3ff4 7619 7005 5a42

= 2.xxx..xxe-19

Я искал, как Matlab ведет себя с числами, и нашел действительно интересные вещи, такие как «денормализованная мантисса». В то время как realmin составляет около e-308, денормализация мантиссы Matlab дает наименьшее действительное число около e-324. Кроме того, Matlab содержит гораздо больше цифр для «pi» или «exp (1)», чем C++.

С другой стороны, в справке Matlab сказано, что какой бы формат он ни отображал, Matlab использует двойную точность для внутреннего использования.

Итак, я был бы очень признателен, если бы кто-нибудь объяснил, какова точная причина этих различий? Как мы можем провести тесты на эквивалентность в Matlab и C++?

10
задан crbah 22 June 2012 в 08:17
поделиться