разница результата выполнения одного и того же кода в MATLAB и С++

RosV
Сообщения: 8
Зарегистрирован: 18 окт 2020, 10:20

разница результата выполнения одного и того же кода в MATLAB и С++

Сообщение RosV »

Здравствуйте, возник вопрос следующего плана, про сравнение результатов выполнения кода в MATLAB и вVisual Studio (C++). Приведу одинаковый по смыслу код, выполняемый в MATLAB и С++, вычисляющий значения экспоненты:
(MATLAB)
M_PI = 3.1415926535897932384626433832795;
f1 = 12020;
td1 = 1/48000;
NumSampls = 188238;
Vt1 = zeros(NumSampls,1);%вектор временных отсчётов
for i = 1:length(Vt1)-1
Vt1(i+1) = Vt1(i) + td1;
end
exp = cos(2*M_PI*12020*Vt1)-1j*sin(2*M_PI*12020*Vt1);%значения экспоненты cos(2*pi*f*t)-j*sin(2*pi*f*t)
(C++)
#define M_PI 3.1415926535897932384626433832795;
double f1 = 12020;
double td1 = 1./48000.;
NumSampls = 188238;
complex_t* MinusExp = new complex_t [NumSampls];
linspace(0, (NumSampls -1)*td1, NumSampls, DSPL_SYMMETRIC, t);
for (int i = 0; i < NumSampls; i++)
{
RE(MinusExp) = cos(2 * M_PI*f1*t);
IM(MinusExp) = -sin(2 * M_PI*f1*t);
}
writebin(MinusExp,
NumSampls,
DAT_COMPLEX,
"dat/ExpCmplx"
);
Результат выполненного кода в MATLAB и C++ проверяю в MATLAB, предварительно, выгрузив данные из C++ с помощью фукции записи бинарных данных в формате double, writebin(…), как показано в коде для С++. В MATLAB загружаю с помощью функции readbin(…) [https://ru.dsplib.org/dspl/group___i_n_ ... 67ddff0078, раздел в «writebin»]. Поверку осуществляю кодом в MATLAB:
[ExpCmplxCpp, ~, ~] = readbin(".\dat\ExpCmplx");
sum(ExpCmplxCpp-exp);% exp – результат, полученный в MATLAB, ExpCmplxCpp – результат, полученный в С++.
В итоге должен быть 0, если векторы ExpCmplxCpp и exp совпадают. Но получается: 1.2724e-14 - 5.4651e-15i. Хотя порядок разницы небольшой e-14 (e-15), но всё равно, если не до конца понимаешь откуда эта разница берётся, сложно спрогнозировать поведение программы, особенно, если продолжить обрабатывать данные в дальнейшем с помощью алгоритмов DSP. Собственно, вопрос: откуда берётся эта разница, при условии, что числа одинакового представления (double) и возможный ответ:
компиляторы MATLAB и С++ создают разный машинный код. Хотелось бы услышать мнения.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: разница результата выполнения одного и того же кода в MATLAB и С++

Сообщение Бахурин Сергей »

Разница берётся в результате выполнения арифметических операций и округлений чисел в формате плавающей точки. Для типа double существует наименьшее число которое может быть представлено данным типом. Это число как раз имеет порядок E-16. В вашем коде генерируется синусы и косинусы, да к тому же присутствует число пи.
Так что разница между вычислениями вполне возможна. Если попробуете сравнивать разные математические пакеты, например матлаб и октаву, или питон, то разница также будет наблюдаться. В питоне например в пакете numpy есть метод isclose, который сравнивает данные с учётом возможного отклонения при представлении в формате float и double.

RosV
Сообщения: 8
Зарегистрирован: 18 окт 2020, 10:20

Re: разница результата выполнения одного и того же кода в MATLAB и С++

Сообщение RosV »

Бахурин Сергей писал(а):
09 ноя 2020, 00:01
Разница берётся в результате выполнения арифметических операций и округлений чисел в формате плавающей точки. Для типа double существует наименьшее число которое может быть представлено данным типом.
Да-к вроде тип double используется и в MATLAB и в С++, следовательно округления, если и происходят, должны быть одинаковыми???

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: разница результата выполнения одного и того же кода в MATLAB и С++

Сообщение Бахурин Сергей »

Не будут они одинаковыми. Например a*b*c*d может давать разный результат в зависимости от последовательности операций. Т.е. фактически получается, что a*b*c*d в результате округлений может быть не равно b*d*c*a, хотя все числа double. При этом компилятор имеет встроенный оптимизатор, который может изменять порядок выполнения команд и точного повторения порядка команд одного и того же алгоритма в разных реализациях добиться практически невозможно.

Вот пример на Си

Код: Выделить всё

    double a, b, c, d, x, y;
    a = sqrt(1000.0);
    b = 1000.0/9.0;
    c = log(100.0/3.0);
    d = 10.0/11.0;
    x = (a+b)*c*d;
    y =  b*c*d + a*c*d;
    printf("y - x = %.6E\n", y - x);
результат
y - x = 5.684342E-014

RosV
Сообщения: 8
Зарегистрирован: 18 окт 2020, 10:20

Re: разница результата выполнения одного и того же кода в MATLAB и С++

Сообщение RosV »

Спасибо за подробные объяснения. Тогда хотел бы поинтересоваться: как же тогда, в таком многообразии компиляторов, всевозможных математических пакетов обеспечить портируемость проектов и алгоритмов, применять методы цифровой обработки, да и, в конце концов, обеспечить единство измерений?

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: разница результата выполнения одного и того же кода в MATLAB и С++

Сообщение Бахурин Сергей »

А в чем проблема то? Просто в алгоритмах возникают относительные ошибки на 13..16 порядков меньшие величины исходных данных. При порядках относительной ошибки меньше e-13 алгоритмы считаются идентичными. С точки зрения обработки сигналов это обеспечивает динамический диапазон 260 дБ, что перекрывает практически все мыслимые прикладные потребности. Вы же не переживаете, что разные пакеты и компиляторы могут использовать разные округления числа пи, или sqrt(2) тоже невозможно точно представить ни в каком пакете. А ещё синусы с косинусами также рассчитывают с ошибками через ряды или итерационные процедуры.

RosV
Сообщения: 8
Зарегистрирован: 18 окт 2020, 10:20

Re: разница результата выполнения одного и того же кода в MATLAB и С++

Сообщение RosV »

Спасибо, понятно.
Бахурин Сергей писал(а):
09 ноя 2020, 22:55
При порядках относительной ошибки меньше e-13 алгоритмы считаются идентичными
- не встречал литературы по этой теме, можете что-нибудь порекомендовать.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: разница результата выполнения одного и того же кода в MATLAB и С++

Сообщение Бахурин Сергей »

Можете начать с википедиии двигаться по списку литературы дальше.

Умозаключение по поводу идентичности алгоритмов при относительной разнице 1E-13 литературу не порекомендую. Могу лишь указать выдержку из описания пакета math языка python. См. описание метода isclose.
По умолчанию пакет math считает, что значения "близки" если относительная погрешность меньше 1E-9.

Ответить