Самый простой способ посчитать количество знаков после запятой? - страница 3

 
Спасибо.

Я так понял, без цикла не получится, каким-то простым способом, типа логарифма.
 
igrok333:
Спасибо.

Я так понял, без цикла не получится, каким-то простым способом, типа логарифма.
А что, вычислять логарифм проще и быстрее всего? По мне, так превратить в строку проще и быстрее. Кто-нибудь сравнивал?
 
igrok333:

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


0.02
0.0005
0.00000008

Так у Вас что, число-то с одной значащей цифрой? 0.9985 - не интересует?
 
Nikolai Semko:

такой вариант, но сочинил на ходу, не проверял с пристрастием

Проверил с пристрастием - косячит мой вариант.
Остальные варианты, которые видел, тоже косячат.
вот верный вариант, учитывающий 15 значащих цифр без учета точки:

int Digits(double x) {
   if (x<0) x=-x;
   if (x>=ULONG_MAX) return 0;
   ulong z=ulong(x);
   ulong y= ulong((x-z)*1e16);
   int N=0;
   do {
      z/=10;
      y/=10;
      N++;
   } while(z!=0);
   if(y==0) return 0;
   if(y%10==9) y++;
   int n=0;
   while (y%10==0) {
      y/=10;
      n++;
   }
   return 16-n-N;
}
 
igrok333:
Спасибо.
Я так понял, без цикла не получится, каким-то простым способом, типа логарифма.

через логарифм еще дольше.
В предыдущем сообщении самый быстрый и правильный вариант. На моем ноутбуке время выполнения этой функции около 50 наносекунд (20 миллионов раз в секунду)

Файлы:
digits.mq5  4 kb
 
Vladimir:
А что, вычислять логарифм проще и быстрее всего? По мне, так превратить в строку проще и быстрее. Кто-нибудь сравнивал?

через стринг однозначно медленее.

 
igrok333:

это шутка?

MathLog(10)=2.30

0.02/2.30= 0.00868589

Тут нет целой части.

есть, пользуюсь этой функцией для нормализации лотов, и уже не помню сколько лет

int LotPoint()
  {
   double steplot = 0.00002;//MarketInfo(Symbol(), MODE_LOTSTEP);
   int LotsDigits = (int)MathCeil(MathAbs(MathLog(steplot) / MathLog(10)));
   return(LotsDigits);
  }

0.00002 = 5

0.02 = 2

0.000009 = 6


еще раз напишу - использую для нормализации лота

 
Iurii Tokman:

есть, пользуюсь этой функцией для нормализации лотов, и уже не помню сколько лет

0.00002 = 5

0.02 = 2

0.000009 = 6


еще раз напишу - использую для нормализации лота

У меня аналогично, работает несколько лет

//===============================================================================================
//-------------------- Кол-во знаков после точки в значении торгового лота ---------------------+
//===============================================================================================
int LotDigit(string symb="0") {
 if(symb=="0") symb=_Symbol;
  double lotStep = SymbolInfoDouble(symb, SYMBOL_VOLUME_STEP);
  return((int)MathCeil(MathAbs(MathLog(lotStep)/MathLog(10))));
 }
 
Vladimir:
Так у Вас что, число-то с одной значащей цифрой?

да.

типа "минимальное значение изменения цены" или "минимальное значение изменения лота".

 
Iurii Tokman:

есть, пользуюсь этой функцией для нормализации лотов, и уже не помню сколько лет

0.00002 = 5

0.02 = 2

0.000009 = 6


еще раз напишу - использую для нормализации лота

фантастика! кто это придумал? как оно так работает?!)))