Получаем количество десятичных знаков после запятой любых чисел (не только котировок) в обход Digits() на MQL4 и MQL5 - страница 12

 
Ilya Malev:

Наверное это лучшее решение

не корректно double сравнивать на равенство, тем более задача в точности до знака заключается

посмотрите в МТ4 файл stdlib.mq4, там был пример правильно сравнения double 

CompareDoubles()

ЗЫ: по сабжу вот статья была https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn:
Интересно, как вы будете логарифмы считать, возведения в степень нецелыми числами, использовать тригонометрию,.... использовать сторонние библиотеки, индикаторы... Они все с погрешностью!

если "позарез" нужна супер-мега точность, влёт берём специальные внешние библиотеки типа gnu mp

иначе если нужна гарантированная точность (когда при каждой операции вычисляется ещё и ошибка), то берём всякие "интервальные либы"

если даже этого мало - то вместо вместо цифирь используем полиномы

но ни разу не видел случая чтобы такие загоны были реально востребованы из МТ :-)

тут double за глаза :-)   

 
Igor Makanu:

не корректно double сравнивать на равенство, тем более задача в точности до знака заключается

посмотрите в МТ4 файл stdlib.mq4, там был пример правильно сравнения double 

CompareDoubles()

Ну-ну, и время выполнения с CompareDoubles взлетает в 2 раза. Тогда уж лучше так:

int dtd(double f)
 {
  f/=0.0000001;
 
  if(int(fmod(f,10000000))==0)
   {
    return 0;
   }
  if(int(fmod(f,1000000))==0)
   {
    return 1;
   }
  if(int(fmod(f,100000))==0)
   {
    return 2;
   }
  if(int(fmod(f,10000))==0)
   {
    return 3;
   }
  if(int(fmod(f,1000))==0)
   {
    return 4;
   }
  if(int(fmod(f,100))==0)
   {
    return 5;
   }
  if(int(fmod(f,10))==0)
   {
    return 6;
   }
  return 7;
 }
 
Ilya Malev:

Ну-ну, и время выполнения с CompareDoubles взлетает в 2 раза. Тогда уж лучше так:

речь идет о корректном вычислении, я сейчас не смогу проверить Ваш код, но это не сложно, нужно Ваш пример сравнить с примером с использованием DoubleToStr() в цикле, если отличий нет, значит все корректно

ЗЫ: я пробовал с fmod() кажется выкладывал пример, он не корректно работает, вроде на 0.07 нужно проверить - сразу баг выскакивал

 
Igor Makanu:

речь идет о корректном вычислении, я сейчас не смогу проверить Ваш код, но это не сложно, нужно Ваш пример сравнить с примером с использованием DoubleToStr() в цикле, если отличий нет, значит все корректно

Я уже проверил, и по скорости посчитал - выходит самый удачный вариант. Если не нужно смотреть больше 7 знаков конечно.

З.ы. 0.7 и 0.07 и 500000000.0001 и т.д. все считает правильно.

З.з.ы. а вот с 500000000.9991 справляется хуже. Но на практике форексной это вряд ли важно.

 
Ilya Malev:

Но на практике форексной это вряд ли важно.

зависит от задач, если для торговых приказов, то эта задача вообще не имеет смысла - цены нормализуются до Digits, а лоты относительно минимального лота

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

 
Igor Makanu:

зависит от задач, если для торговых приказов, то эта задача вообще не имеет смысла - цены нормализуются до Digits, а лоты относительно минимального лота

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

Ну разумеется не нейросети писать =)) а скажем удобно хранить цены/лоты/деньги в виде 4-байтового целого с десятичным показателем, сокращая объем данных в 2 раза.

 
Igor Makanu:

не корректно double сравнивать на равенство, тем более задача в точности до знака заключается

посмотрите в МТ4 файл stdlib.mq4, там был пример правильно сравнения double 

CompareDoubles()

ЗЫ: по сабжу вот статья была https://www.mql5.com/ru/articles/1561

Так задача и стоит - определить на сколько знаков x нормализован. Так что все нормально. Если не считать, что не лень было такую лестницу писать.

 
Dmitry Fedoseev:

Если не считать, что не лень было такую лестницу писать.

Можно и без лестницы, только выполняется на 10% дольше.

int dtd2(double f)
 {
  f/=0.0000001;
  int d = 0, i = 10000000;
 
  while( d < 7 && int( fmod( f, i ) ) > 0 )
   {
    i /= 10;
    d ++ ;
   }

  return d ;
 }
 
Ilya Malev:

Можно и без лестницы, только выполняется на 10% дольше.

Вот это вот: f/=0.0000001; вызывает сомнения. 

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