Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Подключи MQL5 Cloud Network. Начни зарабатывать!
nigilist
218
nigilist 2006.09.25 18:40 
Подскажите аналог MathMax только на большее число переменных.
Dmitrii
328
Dmitrii 2006.09.25 19:03  
Можно все переменные скинуть в массив и...
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
41694
Dmitry Fedoseev 2006.09.26 04:59  
MathMax(MathMax(MathMax(x4,x3),x2),x1)

и так далее
hoz
1936
hoz 2013.02.03 13:58  

Integer:

и так далее

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

 


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

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

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

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

Boris
3903
Boris 2013.02.03 23:30  
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
3963
Alexey Navoykov 2013.02.04 11:13  
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
3903
Boris 2013.02.04 11:17  
Meat:

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

 

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

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

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