Что такое операция с плавающей запятой и как их считать (в MATLAB)?

У меня есть задание, в котором мне в основном нужно подсчитать количество операций с плавающей запятой в простой программе, которая включает цикл, матрицу и такие операции, как *, + и ^.

Насколько я понимаю, операция с плавающей запятой — это операция, включающая числа с плавающей запятой, и мы можем быть заинтересованы в подсчете этих операций, потому что я думаю, что они могут быть более затратными для компьютера. Если вы хотите добавить больше деталей в эту часть, было бы неплохо.

Моя проблема в том, что я понятия не имею, какие именно операции включают числа с плавающей запятой, если только я не использую такие функции, как isfloat. В таком случае нужно ли, чтобы только одно из чисел в операции было числом с плавающей запятой, чтобы операция считалась операцией с плавающей запятой, верно? Если нет, то почему? Можете ли вы добавить более подробную информацию об этом?

Например, предположим, что у меня есть следующая простая функция:

function [r, n] = naive(c, x)
% c is the vector of coefficients of the polynomial
% The coeffiecients should be given as follows
% c(1) = coefficient of x^0 (or 1).
% c(length(c)) = coefficient of the largest power of x
% x is the point to evaluate the polynomial at
% r is the result of the evaluation
% (Assumes that the entries are integers)

r = c(1);
n = 0;

for i=2:length(c)
    r = r + c(i) * x^(i - 1);
    n = n + 2 + (i - 1);
end

end

который в основном вычисляет нормальный полином, оцененный в x, учитывая коэффициенты в векторе c.

Как видно из кода, n на самом деле отслеживает операции с плавающей запятой. Но на самом деле я считаю каждую математическую операцию (кроме присваивания) операцией с плавающей запятой, но это, конечно, может быть неправильно, или это так? Если да или нет, то почему?

И коэффициенты, и c могут быть числами с плавающей запятой. Итак, вместо того, чтобы считать каждую операцию операцией с плавающей запятой, должны ли мы сначала проверить, например, isfloat, являются ли числа с плавающей запятой, и только затем увеличивать n?

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

Спасибо за любую помощь!


person nbro    schedule 04.03.2016    source источник
comment
Я думаю, что вы пересчитываете на единицу в каждой итерации. Есть i-1 умножения и одно сложение.   -  person Patricia Shanahan    schedule 04.03.2016
comment
@PatriciaShanahan Это может быть правильно, поскольку x^y = xx...*x, то есть у нас есть y xs, но умножения просто y - 1.   -  person nbro    schedule 04.03.2016
comment
Другой способ думать об этом: напишите список терминов, которые нужно умножить, за y следует i-1 экземпляр x, всего i терминов. Теперь поставьте знак умножения между каждой парой терминов. У вас будет i-1 знаков умножения.   -  person Patricia Shanahan    schedule 04.03.2016
comment
@PatriciaShanahan Кстати, у вас есть идеи относительно других моих сомнений/проблем?   -  person nbro    schedule 04.03.2016
comment
К вашему сведению, функция flops устарела еще в 2000 году по причинам, описанным в эта статья (см. в конце) основателя MathWorks Клева Молера. Это хорошее упражнение, но вы (и ваш инструктор) должны знать, что оно может быть бесполезным для характеристики производительности Matlab (тем более с современной JIT-компиляцией).   -  person horchler    schedule 04.03.2016
comment
Вы не считаете каждую математическую операцию. Вычисление c(i) наивно использует целочисленное умножение и сложение. Я ожидаю, что Matlab выполнит оптимизацию, чтобы сократить операции в цикле до целочисленного сложения.   -  person Patricia Shanahan    schedule 04.03.2016
comment
@PatriciaShanahan Итак, что вы думаете? Должен ли я также считать c(i) более чем двумя операциями с плавающей запятой? В общем, есть ли хорошая документация для извлечения этой информации (например, та, которую вы мне дали), т.е. сколько операций с плавающей запятой фактически используется для вводящих в заблуждение операций, таких как индексация?   -  person nbro    schedule 05.03.2016
comment
Нет, вы не должны считать их операциями с плавающей запятой, потому что они, скорее всего, будут операциями с целыми числами. В основном я пытаюсь проиллюстрировать трудности оптимизации работы. Что, если Matlab заметит, что вы можете использовать один из промежуточных результатов предыдущей итерации, чтобы уменьшить стоимость вычисления показателя степени?   -  person Patricia Shanahan    schedule 05.03.2016
comment
@PatriciaShanahan Да, действительно, такого рода упражнения немного вводят в заблуждение, потому что они также зависят от базовой реализации ... и мы не можем знать все наверняка, если не посмотрим на исходный код.   -  person nbro    schedule 05.03.2016
comment
Существует Matlab [функция] [1] для обмена файлами, который звучит так, как будто он делает что-то подобное. Возможно, вы сможете заглянуть в их сценарий, чтобы увидеть, как он работает, и извлечь оттуда некоторые мысли/идеи. Опять же... это комментарий, а не ответ. Я просто хотел добавить свой вклад. [1]: mathworks.com/ matlabcentral/файловый обмен/   -  person ThatsRightJack    schedule 13.03.2016