Скачать MetaTrader 5

аналог MathMax только на большее число переменных

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
nigilist
219
nigilist  
Подскажите аналог MathMax только на большее число переменных.
Dmitrii
328
Dmitrii  
Можно все переменные скинуть в массив и...
double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int    maxValueIdx=ArrayMaximum(num_array);
Print("Max value = ", num_array[maxValueIdx]);
Dmitry Fedoseev
44465
Dmitry Fedoseev  
MathMax(MathMax(MathMax(x4,x3),x2),x1)

и так далее
hoz
1936
hoz  

Integer:

и так далее

MathMax(MathMax(MathMax(x4,x3),x2),x1)

 


 Ого. Интересно, как по производительности такой подход "ударит".
Boris
3921
Boris  
hoz:

 Ого. Интересно, как по производительности такой подход "ударит".
Операции с числами не влияют на "производительность" так, как логические операции, особенно, если затесался алогизм. И вообще, производительность прибыли с лихвой покроют недостаточную прооизводительность в скорости! :)
Alexey Navoykov
4235
Alexey Navoykov  

Если важна производительность, то MathMax лучше не использовать, т.к. он медленней обычной конструкции  if (a>b) x=a; else x=b;

Поэтому если переменных много, то можно использовать эту конструкцию в цикле. А если не много, то последовательно проверять каждую переменную.

Boris
3921
Boris  
Meat:

Если важна производительность, то MathMax лучше не использовать, т.к. он медленней обычной конструкции  if (a>b) x=a; else x=b;

Поэтому если переменных много, то можно использовать эту конструкцию в цикле. А если не много, то последовательно проверять каждую переменную.

Конечно, но разговор завели о MathMax. if() else больше всего и употребляем.

Алексей, как Вы думаете, и в этом случае лучше одно выражение с MathMax'ами заменить на конструкцию с if?

double dist = MathMax(MathMax(NormalizeDouble(Dist*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//это заменить?
// на это?
double dist = NormalizeDouble(Dist*Point,Digits);
if(spread > StopLevel && spread > FreezeLevel && spread > dist) dist = spread;
if(spread < StopLevel && spread < FreezeLevel)
{
  if(StopLevel > FreezeLevel && StopLevel > dist) dist = StopLevel;
  if(StopLevel < FreezeLevel && FreezeLevel > dist) dist = FreezeLevel;
}


Alexey Navoykov
4235
Alexey Navoykov  
borilunad:

Конечно, но разговор завели о MathMax. if() else больше всего и употребляем.

Алексей, как Вы думаете, и в этом случае лучше одно выражение с MathMax'ами заменить на конструкцию с if? 

Что-то Вы накрутили тут столько всего лишнего. Проще ведь такой вариант:

double dist = NormalizeDouble(Dist*Point,Digits);
if (dist < spread) dist= spread;
if (dist < StopLevel) dist= StopLevel;
if (dist < FreezeLevel) dist= FreezeLevel;
Boris
3921
Boris  
Meat:

Что-то Вы накрутили тут столько всего лишнего. Проще ведь такой вариант:

 

Снял вопрос. Понял, что параметр принимает другое значение, потому не надо сравнивать их между собой. Спасибо большое!
Alexey Navoykov
4235
Alexey Navoykov  
borilunad:
А как узнать, что больше?
В смысле?
Alexey Navoykov
4235
Alexey Navoykov  

Впрочем ко всему надо подходить с рациональной точки зрения. Например в данном случае вряд ли есть необходимость в такой оптимизации скорости программы, ведь StopLevel, FreezeLevel, spread и Point не меняются в процессе выполнения рабочего цикла, т.е. их не нужно пересчитывать на каждой итерации. А значит переменную dist достаточно посчитать всего один раз, перед началом цикла. Поэтому проще использовать вариант с MathMax, т.к. он сэкономит 3 строчки кода :)  Хотя конечно немаловажна также и читаемость кода, но тут уже надо смотреть индивидуально, удобен ли MathMax(MathMax...) для восприятия.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий