Если бы у вас было намного больше чисел для умножения или если умножение было чрезвычайно дорогим, то я мог бы сделать одну вещь.
Если у вас было огромное количество чисел для умножения, вы могли бы разделитьих в подмножества и запомните продукт каждого набора.Когда конкретный набор изменяется из-за изменения одного из его членов, то запомненный продукт становится недействительным и требует пересчета.Вы можете сделать это на нескольких уровнях в зависимости от того, сколько стоит умножение, сколько у вас памяти и как часто все меняется.Как лучше всего реализовать это в C, вероятно, зависит от того, как переменные меняются - если приходит событие, которое говорит: «вот новое значение для C», то вы можете сделать недействительными все продукты, в которых есть C (или проверить, что староеC на самом деле отличается от нового C до аннулирования).Если они являются изменчивыми переменными, то вам, вероятно, нужно будет просто сравнить каждое из текущих значений с предыдущими значениями (и это, вероятно, займет столько же или больше времени, сколько просто умножение на любой машине с инструкцией аппаратного умножения).
Итак, если у вас есть:
answer = A * B * C * D * E * F * G * H;
, то вы можете разделить их на:
answer = ( (A * B) * (C * D) ) * ( (E * F) * (G * H) );
Тогда, вместо того, чтобы выполнять это умножение непосредственно в C, вы должны былисделайте это в дереве выражений:
answer
*
/ \
/ \
/ \
ABCD EFGH
* *
/ \ / \
/ \ / \
AB CD EF GH
* * * *
/ \ / \ / \ / \
A B C D E F G H
Затем на каждом уровне (ну, может быть, только на нескольких верхних уровнях) у вас может быть запомненный подответ, а также некоторые данные, чтобы сообщить вам, если переменные ниже негоизменился.Если события приходят, чтобы сказать вам, чтобы изменить переменную, то это может привести к распространению недействительности выражения вверх при получении события (или просто пересчитать запомненные подответы для каждого события).Если переменные просто волшебным образом изменяются, и вы должны изучить их, чтобы сказать, что они изменились, тогда у вас есть больше работы.
О, другой способ сделать это просто появился у меня в голове, и мне стыдно, чтоЯ не думал об этом раньше.Если вы знаете старые и новые значения переменной, которая изменилась тогда, если старое значение не было 0, вы могли бы просто:
new_answer = (old_answer * new_var) / old_var;
В реальной математике это будет работать, но в компьютерематематика это может потерять слишком много точности для ваших целей.