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

 
Slava:

NormalizeDouble - это очень дорогая функция. Дороже, чем простое округление. Проверьте профилировщиком. Используйте только для получения цены. В обычной жизни старайтесь избегать NormalizeDouble

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

 
Dmitry Fedoseev:

Конечно можно преобразовать в строку, разобрать по знакам, всех их проанализировать, но это будет медленно работать. 

 Дмитрий, я сейчас не помню, по моему Вы ему написали, что думать за него не будите - правильно. В справочниках все есть. Почему я еще написал стринг, так как у стринг наивысший приоритет и через нее можно преобразовывать все куда захочешь; можно саму переменную не объявлять, а вкладывать преобразования один в другой. Пусть читает и преобразовывает куда хочет - все в его руках. Этот язык программирования хороший и есть над чем думать. И тут был задан скорей всего не вопрос, о чем-то?! А типа упрека. И этот упрек фактически ни чем не обоснован. Почему-то ни кто не спрашивает с первого класса: Почему число нельзя делить на ноль. Сказали нельзя - значит нельзя. Так и тут в программировании int - это целые числа, double - действительные числа; так тут еще float нет, а то бы все, мозг совсем озяб бы. И тут математика фактически не нужна. Тут просто сесть надо и подумать. Почему-то мне однажды пришла такая мысль что стринг можно использовать для преобразования, я просто смотрел справочник и увидел что там со стринг можно производить все-возможные манипуляции и подумал - а почему бы не использовать это в своих целях?! И я не кого ни когда не учу. Но и не умею скрывать. Есть справочник - пусть читает и думает. 

 
Sergey Savinkin:

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

StrToDouble(DoubleToStr(имя переменной, сколько надо знаков после запятой)); Как-то так?!

А округлять, по ходу придется еще кое что дописать и уже это поместить, где сколько знаков после запятой.

В принципе есть по ходу стандартные функции математические округления. Я не помню, однако. Но по ходу они должны быть.

 
И что-то не нашел функции для округления чисел?! 

MathIsValidNumber - можно вот эту еще использовать для проверки корректности числа. И по ходу там уже будет происходить округление. Так что через стринг все что пожелаете можно делать с числами.

 
Yrii Kuksov:
И что-то не нашел функции для округления чисел?! 

MathIsValidNumber - можно вот эту еще использовать для проверки корректности числа. И по ходу там уже будет происходить округление. Так что через стринг все что пожелаете можно делать с числами.

ceil  ,   round  ,  floor

Но существует более быстрая реализация:

double Ceil (double x) { return double((x!=x || x>(long)1<<53 || x<-(long)1<<53)?x:(x-(long)x>0)?(long)x+1:(x>-1 && x<0)?-0.0:(long)x);}
double Round(double x) { return double((x!=x || x>(long)1<<53 || x<-(long)1<<53)?x:(x>=0)?(long)(x+0.5):(x>-0.5)?-0.0:(long)(x-0.5));}
double Floor(double x) { return double((x!=x || x>(long)1<<53 || x<-(long)1<<53)?x:(x>0)?(long)x:((long)x-x>0)?(long)x-1:(long)x);}

Для информации:

функция MathIsValidNumber  эквивалентна записи (d==d)  , где d - число типа double.

// две эквивалентные записи
if (MathIsValidNumber(d)) ....   
if (d==d)  ....

согласитесь - писать короче и помнить название функции не надо. :))

Также выкинте мысли про работу с числами double через string. Это ооочччееенннььь медленно.

 
Nikolai Semko:

ceil  ,   round  ,  floor

Но существует более быстрая реализация:

Для информации:

функция MathIsValidNumber  эквивалентна записи (d==d)  , где d - число типа double.

согласитесь - писать короче и помнить название функции не надо. :))

Также выкинте мысли про работу с числами double через string. Это ооочччееенннььь медленно.

Николай соглашусь полностью.  И Вы используете побитовый сдвиг. Это очень хорошо. Даже очень. Лично я еще до такого не дошел. Только балуюсь кое чем. Но это Николай - похвально, если это Ваше и Вы владеете побитовой логикой. Я с Вашего разрешения скопирую Ваши функции и будет время опробую их. Для меня это ново и возможно очень большая прибавка будет к моей логике, так как побитовые операции это по ходу и есть сама логика, true, false. 

 
Nikolai Semko:

ceil  ,   round  ,  floor

Николай, Вы молодец. Я уже месяца три топтался на месте. Сдвигов ноль. Сейчас буду учить, там вроде как сдвиг с целыми числами производит деление и умножение вроде, (только что прочел), на Си, но тут принцип по ходу один. Спасибо.

 
Yrii Kuksov:

Николай, Вы молодец. Я уже месяца три топтался на месте. Сдвигов ноль. Сейчас буду учить, там вроде как сдвиг с целыми числами производит деление и умножение вроде, (только что прочел), на Си, но тут принцип по ходу один. Спасибо.

Пожалуйста конечно.
Но я не пойму - Вы 3 месяца не могли найти стандартные функции округления в MQL?

 
Yurij Izyumov:

Я понимаю что тема наверно всем уже приелась с этими double, но тем не менее вопрос немного другой

почему число double умноженное на 100000 к примеру может быть равно совсем другому числу как если бы просто переставить запятую на пять знаков выше

пример : 

как такое вообще может быть ? между числами разница в 1 пункт а их умножение на 100000 - равны 

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

но никак не могу увидеть собственно этот момент NormalizeDouble ничего не даёт

а мне необходимо посчитать число пересечений между одной ценой - на истории с точностью до пункта, по этому взял привёл цену к целому, и в массив скидываю по пунктам +1 в каждую ячейку

но из-за того что иногда происходит вот такое - что умножение разных числе на 100000 равны одному и тому же - происходит не правильный подсчет

приложу тестовый скрипт, который надо запустить на графике M1 ? и тогда сами увидите

Как можно точнее переводить double в int ?

int I(double D){
   int x=D+0.5;
   return(x);
}
 
Nikolai Semko:

Пожалуйста конечно.
Но я не пойму - Вы 3 месяца не могли найти стандартные функции округления в MQL?

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

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

Причина обращения: