Obter o número de casas decimais de quaisquer números (não apenas citações) contornando Dígitos() em MQL4 e MQL5 - página 22

 
Andrey Khatimlianskii:

Não é necessário.

Você tem uma boca grande, não tem...?

Aqui está um conjunto de 10.000 elementos, completamente aleatórios, aleatorizados antes de cada ciclo de classificação. Tempo total (ms) para 1000 repetições de cada método.

Built-in ArraySort, meu método escrito há alguns dias (antes disso eu não lidava com algoritmos de classificação ), e 6 melhores métodos de sua biblioteca (o resto era muito pior), enquanto eu removi tudo relacionado a gráficos de lá...

#include <Sort\GSort.mqh>
#define    ttt                 template<typename T>
#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn&&!_StopFlag;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}


ttt void a_rand(T&ar[]){for(int i=0;i<ArraySize(ar);i++)ar[i]=T(rand()*rand());}

ttt int TreePop(T&t[],T&ar[],int i=0,int b=0)
 {
  if(t[b+1]>=0)i=TreePop(t,ar,i,(int)t[b+1]);
  ar[i++]=t[b];
  if(t[b+2]>=0)i=TreePop(t,ar,i,(int)t[b+2]);
  return i;
 }

ttt void TreeSort(T&ar[])
 {
  int sz=ArrayRange(ar,0);
  T t[];ArrayResize(t,sz*3);ArrayInitialize(t,-1);
  for(int i=0;i<ArraySize(ar);i++){t[i*3]=ar[i];
    if(!i)continue;
    int b=0;
    while(1)
      if(ar[i]<=t[b])
        if(t[b+1]>=0)b=(int)t[b+1];
        else{t[b+1]=i*3;break;}
      else
        if(t[b+2]>=0)b=(int)t[b+2];
        else{t[b+2]=i*3;break;}}
  TreePop(t,ar);
 }


void OnStart(){
  double ar[];
  int N=10000,k=3;
  ArrayResize(ar,N);

  test(k,"ArraySort(MQL5)",a_rand(ar);ArraySort(ar))
  test(k,"TreeSort(AntFX)",a_rand(ar);TreeSort(ar))
  test(k,"Merge(GSort)",a_rand(ar);GMergesort(ar,0,N-1))
  test(k,"QTernaryLL(GSort)",a_rand(ar);GQSortTernaryLL(ar,0,N-1))
  test(k,"QSortLL(GSort)",a_rand(ar);GQSortTernaryLL(ar,0,N-1))
  test(k,"QSort(GSort)",a_rand(ar);GQSortTernaryLR(ar,0,N-1))
  test(k,"QTernaryLR(GSort)",a_rand(ar);GQSortTernaryLR(ar,0,N-1))
  test(k,"Comb(GSort)",a_rand(ar);GComb(ar))
}
 
Ilya Malev:

Você tem uma boca grande, não tem...?

Aqui está um conjunto de 10.000 elementos, completamente aleatórios, aleatorizados antes de cada ciclo de classificação. Tempo total (ms) para 1000 repetições de cada método.

Built-in ArraySort, meu método escrito há alguns dias (antes disso eu não estava fazendo nenhum algoritmo de classificação), e 6 melhores métodos de sua biblioteca (os demais eram muito piores), enquanto eu removi tudo relacionado a gráficos de lá...

A julgar pelo vídeo do artigo, os mais rápidos são Count, LSD e MSD.

 
Andrey Khatimlianskii:

A julgar pelo vídeo do artigo, os mais rápidos são Count, LSD e MSD.

Eu nunca esperei que estes passes fossem concluídos.

 
Alexandr Sokolov:

Acho que não sou o único que teve uma situação rara em que precisei obter o número de casas decimais, e a função Dígitos() funciona apenas com citações, e além disso não há informações sobre isso em nenhum lugar (pelo menos na hora de escrever este post eu não o encontrei antes, então quero mostrar que solução encontrei).


Como se viu, a essência do banal é simples, mas ainda tem uma desvantagem - esta função não reconhece zeros, se depois deles não houver outros dígitos. Por exemplo, esta função retornará 2 quando seguida por 0,01, mas quando seguida por 0,0000 retornará 0 (o que significa que não pode ver quatro zeros). Portanto, considere esta lacuna em seus desenvolvimentos.


Código em MQL4


O código na MQL5

O código MQL5 teve que ser ligeiramente melhorado, já que aparentemente em MQL5 variáveis de tipo duplo são automaticamente atribuídas 0 no final, não importa se a variável é um número inteiro ou não. E por esta razão, a função nunca retornou 0.

Se este tópico for relevante, aqui está meu exemplo:

int kol_Z(double zzz) { // calcular o número de casas decimais

string a, d;
int b, c;
a=StringFormat("%g", zzz);
b=StringFind(a",",0);
c=StringLen(a);
se (b===-1) retornar(0);
d=StringSubstr(a,b+1);
return(StringLen(d));
}
 
NomadSoul:

se o tópico for relevante, aqui está minha opinião sobre ele:

Exemplo:

void OnStart()
{
    Print(kol_Z(1.001234));
}

Resultado: 5 e deve ser 6

 
A100:

Exemplo:

Resultado: 5, que deve ser 6.

o número de casas decimais...". Como você pode dar a um computador um número que ele é obrigado a truncar ao comprimento da mantissa que ele tem, e depois perguntar-lhe onde foi o fim daquela fração periódica infinita?

0,0001100110011001100110011(0011) é um número decimal 0,1 em representação binária. A parte periódica da fração infinita está entre parênteses. Então, o que o computador deve responder, se armazena apenas os primeiros 52 dígitos significativos do número infinito em dobro?

Ninguém se surpreende que o número ternário muito curto 0,1 em representação decimal (0,33333...) tenha um número infinito de dígitos significativos após o ponto decimal. Binário 0,1 é igual a 0,5 decimal com um número finito de dígitos por feliz acidente, encontrado e reduzido um divisor comum nas duas bases dos sistemas de notação 2 e 10, é 2. Graus de metade em ambas as representações também são bons: 0,5 => 0,1; 0,05 => 0,01 ; 0,025 => 0,001 ; 0,0125 => 0,0001. Mas assim que 5 aparecem no denominador de uma fração, é isso, há muitos dígitos significativos.

O número de dígitos significativos na parte fracionária está relacionado ao número de dígitos utilizados na representação, e não apenas ao valor do número.

Самый простой способ посчитать количество знаков после запятой?
Самый простой способ посчитать количество знаков после запятой?
  • 2021.01.18
  • www.mql5.com
Есть переменная. Например: double а=0.02; Нужно написать функцию, которая считала бы количество знаков после запятой...
 

1

Já o executei três vezes. Está a respirar pelo pescoço do líder... Se alguém precisar dele, a função aqui éhttps://www.mql5.com/ru/code/904, o nome da função é SortHoareUp.

 
Dmitry Fedoseev:

Já o executei três vezes. Está a respirar pelo pescoço do líder... Se alguém precisar, a função aqui éhttps://www.mql5.com/ru/code/904, o nome da função é SortHoareUp.

Há também oMathQuickSort() da biblioteca (#include <Math\Stat\Math.mqh>). Lembro que havia um artigo onde eles escreviam que é uma biblioteca muito rápida).

Eu não medi a velocidade, eu a uso principalmente porque ela me permite salvar uma série de índices de matriz de fontes.

 
Vladimir:

o número de casas decimais...". Como você pode dar a um computador um número que ele tem que truncar ao comprimento da mantissa que ele tem, e depois perguntar-lhe onde foi o fim daquela fração periódica infinita?

0,0001100110011001100110011(0011) é um número decimal 0,1 em representação binária. A parte periódica da fração infinita está entre parênteses. Então, o que o computador deve responder, se armazena apenas os primeiros 52 dígitos significativos do número infinito em dobro?

Ninguém se surpreende que o número ternário muito curto 0,1 em representação decimal (0,33333...) tenha um número infinito de dígitos significativos após o ponto decimal. Binário 0,1 é igual a 0,5 decimal com um número finito de dígitos por feliz acidente, encontrado e reduzido um divisor comum nas duas bases dos sistemas de notação 2 e 10, é 2. Graus de metade em ambas as representações também são bons: 0,5 => 0,1; 0,05 => 0,01 ; 0,025 => 0,001 ; 0,0125 => 0,0001. Mas assim que o 5 aparece no denominador, é isso, há muitos dígitos significativos.

O número de dígitos significativos na parte fracionada está relacionado ao número de dígitos utilizados na representação, e não apenas ao valor do número.

Seria uma boa idéia definir primeiro as condições do problema a ser resolvido. Se estamos falando de algum tipo de estudo teórico de representação numérica no computador, precisamos esclarecer melhor o objetivo deste estudo.

Se a pergunta for sobre qual número inteiro fornecer como segundo argumento para a função NormalizeDouble(), você deve usar a mesma função para encontrar a resposta. Este será o número inteiro mínimo entre 0 e 8, para o qual o número normalizado será igual ao número da fonte. Se não for possível encontrar tal número inteiro, o número da fonte está incorreto. Aqui está um exemplo decódigo onde o número de dígitos é contado para a etapa de volume mínimo.

Razão: