Pergunta para os mestres da MQL4. Novamente sobre Double Compare. - página 10

 
Simca:
SK. escreveu (a):

Minhas sinceras condolências aos desenvolvedores, tendo queexplicar a mesma coisa1000 vezes a cada novo usuário...



Este já é um ataque gritante...
Eu concordo. Embora a SK. seja uma autoridade no fórum, mas "tecnologia informática específica" também me faz desconfiar.
Está escrito em livros didáticos sobre armazenamento de números reais na memória e não diz nada sobre variáveis que mudam por si mesmas. Embora eu tenha ouvido isso não só da SK neste fórum.
Portanto, se você já enganou cada novo usuário 1000 vezes, você deve agora encontrá-los e pedir desculpas por suas palavras!

Eu concordo com Simca. Ao realizar operações aritméticas são possíveis erros, mas ao armazenar, escrever ou ler, eles são excluídos!

Foi por isso que perguntei ao algoritmo de função NormalizeDouble(), talvez ele também tenha operações aritméticas que causam um erro?
O que você acha Simca?
 

OK. Você diz isso com tanta confiança que eu começo a duvidar do que está dizendo.

Eu costumava trabalhar em um PC antigo com 256MB de RAM até algum tempo atrás. Ao pesquisar alguns programas no Google, o sistema operativo despejaria alguns dos dados no disco e depois os carregaria novamente. Desde que modifiquei o código (especificando a normalização no operador de comparação) o erro parou de aparecer. Mas comecei a duvidar depois de ouvir suas palavras - e se eu realmente não tivesse notado o erro?

Agora eu não sei se devo pedir desculpas ou não. Se eu estiver errado, então deixe que 1000 usuários me perdoem.

(mas ainda assim é melhor realizar a normalização diretamente ao calcular a operação de comparação:)

 
gravity001:
Está escrito em livros didáticos sobre o armazenamento de números reais na memória e não diz nada sobre variáveis que mudam por si mesmas. Mas não foi só aSK que ouvi isso neste fórum.
Nada por si só é alterado durante o armazenamento. Mas a forma como os números reais são representados na memória do computador afeta a precisão (profundidade de bits) dos valores armazenados. Ao realizar operações aritméticas sobre números reais, o resultado muitas vezes é "não suficientemente preciso" (do ponto de vista humano), portanto, às vezes é necessário normalizar o resultado da operação. É definitivamente necessário normalizar o resultado das operações em caso de comparação posterior com a igualdade (muitas vezes para >, <). Também é necessário normalizar o resultado se você operar com valores com a capacidade de dígitos estritamente definida (por exemplo, preços). Os cálculos intermediários com números reais geralmente não requerem normalização.
Mas, tudo isso diz respeito aos cálculos enquanto os valores armazenados na memória não mudarão, independentemente de serem normalizados ou não.
gravidade001:
É por isso que eu estava perguntando ao algoritmo de função NormalizeDouble(), talvez ele também tenha operações aritméticas que causam um erro?
O que você acha Simca?
Bem, sobre o algoritmo da função NormalizeDouble devemos perguntar aos desenvolvedores, e eu não sou um deles. :) Além disso, não é o objeto da disputa, pois a função NormalizeDouble em ambos os fragmentos de código foi utilizada de forma completamente idêntica. A única diferença estava na comparação direta dos resultados das duas normalizações e na escrita desses resultados em variáveis e depois na comparação de seus valores. E notei que como o tipo do valor retornado pela função NormalizeDouble coincide com o tipo da variável utilizada para armazenagem, não haveria diferença entre os fragmentos citados. Mas se a função NormalizeDouble retorna um valor de dimensão maior do que a variável na qual está armazenada, então a diferença pode ocorrer e não podemos ter certeza de que ela seja idêntica. Mas de acordo com a MetaEditor's HELP o tipo de dados em ambos os casos é o dobro, portanto não deve haver diferença, independentemente de como a função NormalizeDouble é implementada.
 
SK. писал (а):

(mas ainda assim é melhor realizar a normalização diretamente ao calcular a operação de comparação:)

E com isto, como aplicado a cada novo usuário, concordo absolutamente. Se você não tem uma idéia clara do que e como funciona, é mais razoável seguir pelo caminho mais seguro e confiável! Mas isso não diz respeito a você e a mim. :)
E de minha parte (para aqueles que não entendem totalmente a essência da pergunta) também posso recomendar:

(mas ainda assim, é melhor realizar a normalização diretamente ao calcular a operação de comparação (c) SK.

 
SK. писал (а):

(mas ainda é melhor fazer a normalização diretamente ao calcular a
a operação de comparação é calculada:)





Desculpe, mas em termos de eficiência há implementações muito melhores para comparar dados que requerem normalização. Basicamente, este é o padrão (algoritmo de comparação). Você tem que comparar a diferença com a metade da dimensão da escala. O que quero dizer: para comparar preços (sejam diferentes ou não) você deve pegar a diferença e compará-la com 0,5*Roynt (pode ser calculada apenas uma vez durante a inicialização do EA/script/indicador. Isto é muito mais eficiente do que chamar uma função, e ainda mais se também estiver em loop) .... E não importa como esses dados são armazenados e a que sinal insignificante são arredondados.

Boa sorte.
 
Em primeiro lugar, o trabalho com rublos é puramente uma coisa de compilador, portanto, exigir comodidade do mql4, que é essencialmente um compilador intrínseco oculto, não é razoável. O principal, os desenvolvedores deram uma forma de GARANTIR o resultado correto da comparação, nós verificamos com nossas mãos, é claro que é gráfico, mas é FÁCIL!! Embora a documentação diga que normalizar apenas em caso de "!=" ou "==", nossos testes independentes e especializados mostraram que (a>b) NÃO GARANTEM (!) o resultado correto se a se tornar igual a b! Mesmo que você normalize PREDVORITAMENTE tanto a como b, o resultado é imprevisível. E aqui está uma construção dos desenvolvedores:: NormalizeDuplo(a-b, Dígitos)>0 funciona de forma confiável! Não sei por que as pessoas aqui não gostam de normalizar a função... Talvez (internamente) seja bastante sempotizado assim: duas dobras são divididas por dupla precisão e arredondadas para baixo (ou para cima). Em seguida, os inteiros são comparados sem nenhum problema.
 
.FG писал (а):
Em primeiro lugar, o trabalho com rublos é puramente uma coisa de compilador, portanto, exigir comodidade do mql4, que é essencialmente um compilador intrínseco oculto, não é razoável. O principal, os desenvolvedores deram uma forma de GARANTIR o resultado correto da comparação, nós verificamos com nossas mãos, é claro que é gráfico, mas OBRIGATÓRIO!! Embora a documentação diga que normalizar apenas em caso de "!=" ou "==", nossos testes independentes e especializados mostraram que (a>b) NÃO GARANTEM (!) o resultado correto se a se tornar igual a b! Mesmo que você normalize PREDVORITAMENTE tanto a como b, o resultado é imprevisível. E aqui está uma construção dos desenvolvedores:: NormalizeDuplo(a-b, Dígitos)>0 funciona de forma confiável! Não sei por que as pessoas aqui não gostam de normalizar a função... Talvez (internamente) seja bastante sempotizado assim: duas dobras são divididas por dupla precisão e arredondadas para baixo (ou para cima). E depois os inteiros são comparados sem nenhum problema.

Por favor, escreva em russo apropriado.

 
Dê-me um link para o site do desenvolvedor (do idioma russo), e prometo que usarei SOMENTE as definições do autor. :) Seu ponto de vista, em minha opinião, não mais correto do que o meu, mas se VOCÊS PERSONALMENTE quiserem entender, então eu farei um "porta-voz de Rosh", se você não puder distinguir entre blá-blá e opinião de especialista. Porque eu não escrevi a você, e o 1001º iniciante. :)
 
.FG писал (а):
Dê-me um link para seu site e eu prometo que usarei SOMENTE as DEFINIÇÕES DO AUTOR. :) Sua idéia, eu acho, não é mais correta do que a minha, mas se VOCÊS PERSONALMENTE quiserem entender, eu farei um "porta-voz de Rosh", se você não conseguir distinguir entre blá-blá e avaliação de especialista. Porque eu não estava escrevendo para você, mas para o 1001º recém-chegado. :)

Por exemplo www.gramota.ru

Não temos uma seção albanesa do fórum. Entretanto, após o próximo posto não-russo você será enviado para lá. Por favor, não faça parecer que você está usando o idioma.

 
Nesse caso você, stringo, deve ir para Cyril e Methodius com um Diploma de Conquista em Programação! Todos esses problemas de normalização que encontrei nos compiladores DOS gratuitos, que há muito foram convenientemente implementados nas versões atuais. É por isso que alguns programadores não entendem porque precisam de uma verificação tão desatualizada das duplicações. Quando eles reescrevem seu código, enfiando em toda parte a normólise comparada a zero, eles ficarão surpresos ao encontrar ausência de erros em seu próprio "C-logic", e não comentários DIREITOS de pais-executivos, porque eles podem se colocar de lado na otimização e em outras coisas secundárias. Mas as questões relativas aos RESULTADOS dos cálculos básicos continuarão sendo cruciais, exigindo a máxima atenção. E se você ameaçar me mandar embora novamente, iremos a alguma EMC, pegaremos sua documentação e escreveremos um programa com FIXes e outros truques no OLBANKA. :) E você estará desempregado. Você fará seu mq6 e vai querer alguém que pelo menos teste seus produtos em albanês, mas não, nós não estaremos lá... Porque você mesmo nos baniu calmamente... :)))))))))))))))))))))))000