Правильный перевод double в int - страница 5

 
Sergey Savinkin:

А как сделать "простое округление", не до целого числа, а до некоторого знака после запятой стандартными функциями без NormalizeDouble ?

Как в предыдущем посте, но с небольшими ухищрениями. Если Вам нужно округлить до 0.1, то умножаете на 10, а после той же процедуры умножаете на 0.1. Делить на 10 не стоит - долгая операция. Мы так лет 40 назад делали, ресурсы экономили. 

 
Yrii Kuksov:

Нет, Николай. У меня были типа каникул по ходу и я бездельничал. Я в MQL попутно, скорей с него начал, сейчас учу Си и попутно Си++, хочу научиться писать драйвера и там как-раз надо все делать по битам. Там кто-то где-то припугнул(образно), что не правильно написанный драйвер приводит к синему экрану. И вот я и учить ни чего не учу, и компостирую мозг по ходу всем в интернете. Учусь сам, доходит все туго, но когда пойму соображаю быстро. А Вы меня только что подтолкнули на новый этап. Я не верю в случайности, суда захожу редко. И вот сегодня редко, но метко. Accembler - с ним я осторожен. Опасный механизм. И его потом тоже начну учить. Пару раз попробовал что-то исполнить, понял что он сильно влияет на процессор в компе и подумал, что туда с моим умом пока лезть рано. MQL4 мне очень сильно помог. У меня энцефалопатия(нарушена координация), лет 6 уже, и вот я разговаривал с врачом и он говорит, что Американские врачи пришли к выводу, что эту болезнь лечит логика. А я как в себя пришел и меня выписали из больницы; не кого не узнавал, но из компа не вылазил, забываю - учу, забываю учу по новой и вроде начался процесс восстановления. 

Если логика поможет, то Вы на правильном направлениии. Искренне желаю Вам успехов. У Вас все получится! 

 
Алексей Тарабанов:

Делить на 10 не стоит - долгая операция. Мы так лет 40 назад делали, ресурсы экономили. 

проверять сейчас нужно, да и проверить сложно, принципы работы процессоров сейчас сильно изменились, скорее всего, что умножай, что дели будет одинаково по времени

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

ЗЫ: сейчас не знаю, но на заре появления Пентиум-1 был у меня однокурсник, который тестировал процессоры на уровне математических вычислений с целочисленными числами и с плавающей запятой, на то время Интел лучше АМД считал вещественные числа, а вот АМД и Целерон все время обгоняли аналогичный по частоте Интел в операциях с целыми числами

Распределенные вычисления в сети MQL5 Cloud Network
Распределенные вычисления в сети MQL5 Cloud Network
  • cloud.mql5.com
Большую часть времени современные компьютеры простаивают и не используют всех возможностей процессора. Мы предлагаем задействовать их с пользой. Вы можете сдавать мощности вашего компьютера другим участникам нашей сети для выполнения разнообразных...
 
Nikolai Semko:

Если логика поможет, то Вы на правильном направлениии. Искренне желаю Вам успехов. У Вас все получится! 

Спасибо Николай Вам. Буду стараться.

 
Igor Makanu:

проверять сейчас нужно, да и проверить сложно, принципы работы процессоров сейчас сильно изменились, скорее всего, что умножай, что дели будет одинаково по времени

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

ЗЫ: сейчас не знаю, но на заре появления Пентиум-1 был у меня однокурсник, который тестировал процессоры на уровне математических вычислений с целочисленными числами и с плавающей запятой, на то время Интел лучше АМД считал вещественные числа, а вот АМД и Целерон все время обгоняли аналогичный по частоте Интел в операциях с целыми числами

Не было у нас ни Интела, ни АМД с Целероном. И Пентиума не было, да и 486 тоже. Была ЕС-1030...1045...1050 (IBM 360/370) для разработки и был очень суровый комплекс для реализации. Выдерживал вибрацию, удар кулаком в любое место, электромагнитный импульс и еще много всего. Только оперативной памяти у него было 12 кБ, а в остальном - мужчина. Вот с того времени я знаю, что такое оверлейная структура программы и умею решать нерешаемые задачи. 

 
Алексей Тарабанов:

Не было у нас ни Интела, ни АМД с Целероном. И Пентиума не было, да и 486 тоже. Была ЕС-1030...1045...1050 (IBM 360/370) для разработки и был очень суровый комплекс для реализации. Выдерживал вибрацию, удар кулаком в любое место, электромагнитный импульс и еще много всего. Только оперативной памяти у него было 12 кБ, а в остальном - мужчина. Вот с того времени я знаю, что такое оверлейная структура программы и умею решать нерешаемые задачи. 

ага, я первый курс первый семестр универа даже застиг большие ЭВМ семейства ЕС, номер уже не помню, но помню была аудитория и штук 20 терминалов к этой ЕС, программу на Паскале напишешь в терминале первым, отправишь на компиляцию минут через 5 придет ответ,  а если сделал ошибку, то вот второй раз отправить на компиляцию уже проблема, вернее отправишь, а придет ответ минут через 15 - ибо сокурсники тож дописали и начали процессор грузить. 

Потом закончилось это прикольное программирование, со второго семестра нам Интелы-486 установили, там все летало ))))

 
Igor Makanu:

проверять сейчас нужно, да и проверить сложно, принципы работы процессоров сейчас сильно изменились, скорее всего, что умножай, что дели будет одинаково по времени

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

ЗЫ: сейчас не знаю, но на заре появления Пентиум-1 был у меня однокурсник, который тестировал процессоры на уровне математических вычислений с целочисленными числами и с плавающей запятой, на то время Интел лучше АМД считал вещественные числа, а вот АМД и Целерон все время обгоняли аналогичный по частоте Интел в операциях с целыми числами

Вы правы Игорь. Я лично уже много где встречал, что умножения на ноль или единицу сейчас уже не эффективны и таким образом машину уже не обманешь. Но здесь у меня получалось и именно я избавлялся таким образом от ошибки 1 модификации. Во, а про кэш мне где-то попадалось, но я не обратил на это особого внимания. Мне конечно еще пока до Ваших знаний далеко. Но есть к чему стремиться. Елки, столько надо всего воткнуть в разум - чекнешся?! Да еще это все разложить по полочкам. Вот это да?! Но нужно. Буду учить. Всем Всего Доброго.

 
Yrii Kuksov:

именно я избавлялся таким образом от ошибки 1 модификации

если не ошибаюсь, то ошибка 1 при модификации это модификация с теми же параметрами, что у существующего ордера, т.е. по сути не требуется модификация

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

т.е. примерно так:

slnew = NormalizeDouble(Bid + tpips,Digits);
...
if((OrderStopLoss() > slnew)
 
Igor Makanu:

если не ошибаюсь, то ошибка 1 при модификации это модификация с теме же параметрами, что у существующего ордера, т.е. по сути не требуется модификация

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

т.е. примерно так:

Да, Вы правы, ошибки нет, но результат не известен. И нужны новые параметры при модификации.

 
Sergey Savinkin:

А как сделать "простое округление", не до целого числа, а до некоторого знака после запятой стандартными функциями без NormalizeDouble ?

Для этого эта функция и существует.
Такой аналог NormalizeDouble работает в пару раз быстрее:

double NormalizeDoubleFast(double x,uint d)
  {
   static double z[12]={1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11};
   if(d>11) d=11;
   bool sign=(x>=0);
   if (!sign) x=-x;
   x=x*z[d];
   x=ulong(x+0.5)/z[d];
   return (sign)?x:-x;
  }
2018.09.29 16:25:52.239 Test_NormalizeDouble (NZDUSD,M2)        Время выполнения NormalizeDouble     = 4.37 наносекунд.  Контрольная сумма = 76932730.6581859290599824
2018.09.29 16:25:52.239 Test_NormalizeDouble (NZDUSD,M2)        Время выполнения NormalizeDoubleFast = 2.14 наносекунд.  Контрольная сумма = 76932730.6581859290599824
ЗЫ данный аналог пока не проверял на полное соответствие
Файлы: