Я пытаюсь сделать тесты эквивалентности по алгоритму, написанному на С++ и в 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 --- > [функция С++] --- > 0x3ff4 7619 7005 5a42
0x3ff1 3e42 a211 6cca --- > [Функция MATLAB] --- > ans
ans - 0x3ff4 7619 7005 5a42
= 2.xxx..xxe-19
Я искал, как Matlab ведет числа и нашел действительно интересные вещи, такие как "denormalized mantissa". Хотя realmin около e-308, денормализация мантиссы Matlab имеет наименьшее реальное число около e-324. В дальнейшем matlab содержит еще много цифр для "pi" или "exp (1)", чем для С++.
С другой стороны, помощь Matlab говорит, что независимо от формата, который он отображает, Matlab использует внутреннюю двойную точность.
Итак, я бы очень признателен, если кто-то объяснит, в чем заключается точная причина этих различий? Как мы можем сделать тесты эквивалентности для matlab и С++?