Erros, bugs, perguntas - página 2939

 
x572intraday:
Todos os preços são afixados com cinco casas decimais, e um por alguma razão na mesma lista leva-o desta forma: Porquê? É um erro ou a minha saída deve ser editada com um aspecto uniforme? Bem, digamos, vou penteá-lo com PrintFormat ou fprint, mas em princípio não é uma representação incorrecta do número?

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

Nikolai Semko, 2020.01.05 21:41

Tenho sempre esta pergunta.
Constantemente todos falam da norma IEEE 754, mas as pessoas frequentemente, quando vão à Wikipédia - seja por causa da complexidade, seja por causa da preguiça, saem sem compreender o significado da norma.

Vou gastar algum tempo para tentar explicar este padrão o mais brevemente possível e em palavras simples, a fim de me referir mais a este post.


Assim, o tipo duplo consiste em 8 bytes = 64 bits.(flutuador 4 bytes = 32 bits)

E a representação numérica doduplo e float é composta por 3 componentes:sinal, expoente e mantissa


DUPLO:


FLOAT:

Naturalmente não há representação decimal de números neste formato, apenas binário.

  • O sinal é de 1 bit. Se 0 for + (mais), se 1 for - (menos).
  • O expoente armazena o grau para o número 2. Pode estar no intervalo -12610 a 12710 para flutuar e -1022 10 a 102310 para o dobro
  • A mantissa é a parte fracionária do próprio número em forma binária, reduzida a uma forma em que a vírgula fica após a primeira unidade sem ter em conta essa primeira unidade e a vírgula


Um pouco de compreensão da representação binária dos números e a sua relação com os números decimais:

2 4= 100002 = 1610

2 3= 10002 = 810

2 2= 1002 = 4

2 1=102= 2

2 0=12=110

2 -1= 0.12 =(1/2)10= 0.510

2 -2= 0.012 = (1/4)10= 0.2510

2 -3= 0.0012 = (1/8)10= 0.12510

2 -4= 0.00012 = (1/16)10= 0.062510

2 -5= 0.000012 = (1/32)10= 0.0312510

2 -6= 0.0000012 = (1/64)10= 0.01562510

2 -7= 0.00000012 = (1/128)10= 0.007812510

2 -8= 0.000000012 = (1/256)10= 0.0039062510

2 -9= 0.0000000012 = (1/512)10= 0.00195312510

2 - 10= 0.00000000012 = (1/1024)10= 0.000976562510

2 - 11= 0.000000000012 = (1/2048)10= 0.0004882812510

2 - 12= 0.0000000000012 = (1/4096)10= 0.00024414062510

2 - 13= 0.00000000000012 = (1/8192)10= 0.000122070312510

Vamos rever exemplos para o dobro:

Exemplo #1

Temos um número decimal: 891677.4025191

Este número pode ser representado em formato binário:

110110011011000111011101.011001110000101101110111011111011000100000111111111010001110
(quem quiser pode verificar)))

Extraímos a mantissa do número dado simplesmente movendo a vírgula 19 dígitos para a esquerda (neste caso) para que venha depois da primeira unidade.

1.1011001101100011101011001110000101101111101111000101000001111101110001110* 2 19

Mas temos uma mantissa de apenas 52 bits. Assim, tomamos as primeiras 52 partes significativas

Мантисса = 1011001101100011101011001110000101101111101111000101

Exponente = (19+1023)10 = 100000100102(como o expoente é um número assinado e o expoente pode ser negativo (por exemplo se tivermos 0,0000042132), precisamos de adicionar 1023 a 10(01111111111112), 01111111111112 é zero, tudo mais é positivo, menos é negativo. Por outras palavras, para obter o valor inverso do expoente, precisamos de subtrair 1023 do valor de 11 bits do expoente.

No total, o nosso número 891677.4025191 terá a seguinte aparência no tipo duplo:

0100000100101011001101100011101011001110000101101111101111000101

Mas uma vez que se trata de uma representação binária, vamos convertê-la exactamente para decimal:

que seria891677.4025190999999642521142959595947265625


Exemplo #2

Temos um número decimal: -0.00000145258556224114

Este número pode ser representado em formato binário:

-0.000000000000000000011000010111101100111010110111010011010101001111001110

Seleccionar a mantissa deste número movendo simplesmente a vírgula 20 dígitos para a direita, de modo a que seja depois da primeira unidade.

1.1000010111101100111010110111010011010101001111001110 * 2 -20

Мантисса = 1000010111101100111010110111010011010101001111001110

expoente = (-20+1023)10=011111010112

sinal de menos, portanto o primeiro bit é 1.

O nosso número total -0.00000145258556224114 terá o seguinte aspecto no tipo duplo:

1011111010111000010111101100111010110111010011010101001111001110

convertê-lo exactamente para decimal:

это будет -0.00000145258556224113991124017968015191826225418481044471263885498046875



No seu caso, o problema ocorre com o número 0,01, uma vez que no tipo duplo será representado no formulário:

0 01111111000 0100011110101110000101000111101011100001010001111011

que quando convertido no sistema de notação decimal é igual a 0,0100000000000000000000208166817117216858513294309377670288085937510

Considerando que com representação

310 = 1.5*2 = 1.12*2 1

510 = 2.5*2 = 10.12*2 1

610 = 1.5*4 = 1.12*2 2

710 = 3.5*2 = 11.12*2 1

sem problemas.

Porque é que o número duplo 0,01 é realmente superior a 0,01?

Eis a razão:

0 01111111000 01000111101101011101110100001010111101011101001010001111011011 - 0.010000000000000000000020816681711721685132943093776702880859375 erro = 0.000 000 000 000 000 208166817...

0 01111111000 01000111101101011100001010001111010 - 0.0099999999999999999999999999984747344334114097569175064563751220703125 erro = - 0.000 000 000 000 000 001 5265566...

Para compreender esta química de processo, pode brincar com estas calculadoras:

https://baseconvert.com/ieee-754-floating-point


https://baseconvert.com/ieee-754-floating-point


 

Obrigado, informativo. Bem, basicamente, deveriam os MQs ter sido, mas sub-corrigidos ou a decisão foi deixada ao utilizador?

 

Hm. Existe alguma função ou alguma outra funcionalidade adicional (biblioteca, código) para guardar parâmetros EA?

A tarefa é colocar no local onde o código, que, por exemplo, ao executar a EA num símbolo (função adicional é também análise de período), salvaria o ficheiro de definições definido.

Por exemplo - período do nome da EA - símbolo do período.

Ficheiro com possibilidade de sobrescrever - apenas as últimas definições para o símbolo.

Por exemplo, as configurações padrão no testador são guardadas para a última execução.

 
Bom dia. Problema num computador remoto, não consigo aceder ao website da MQL5, por isso não consigo descarregar o indicador que comprei. Não consigo entrar no site da MQL5, por isso não consigo descarregar o indicador que comprei.
 
Slava Botalov:
Olá, tenho um problema num computador remoto, não consigo aceder ao website da MQL5 e por isso não consigo descarregar o indicador que comprei. não posso descarregar o indicador, por isso não o posso utilizar.


mas um computador remoto no Zomro?

 
x572intraday:

Obrigado, informativo. Bem, basicamente, deveriam os MQs ter, mas com uma correcção insuficiente, ou a decisão é deixada ao utilizador para julgar?

Por isso, não o receberam.
Não há erros.
Tudo é como deveria ser.
 
Vladislav Andruschenko:


mas um computador remoto no Zomro?

Sim

 
Slava Botalov:
Bom dia. Problema num computador remoto, não consigo aceder ao website da MQL5, por isso não consigo descarregar o indicador que comprei. Não posso descarregar o indicador, por isso não o posso instalar no site da MQL5.
Vladislav Andruschenko:


mas um computador remoto no Zomro?

Slava Botalov:

Sim


Este fornecedor é proibido por má conduta grave:

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

Por que razão é bloqueado o acesso a www.mql4.com?

Renat Fatkhullin, 2020.11.17 12:16

***

Todo o fornecedor Zomro com sub-redes está bloqueado por actividades fraudulentas massivas das suas sub-redes.

***
 
Nikolai Semko:
Portanto, eles não compreendem.
Não há erros de todo.
Tudo é como deveria ser.

Não é essa a questão. A questão é, onde pode ser útil, especialmente para os comerciantes, não para os programadores? Nunca vi tais números no terminal nem na escala de preços nem na janela de colocação de encomendas; tudo é igual em todo o lado (algures cinco dígitos, em qualquer outro lugar).

 
Vladimir Karputov:


Este fornecedor foi banido por má conduta grave:

Que pena, teremos de mudar para outro. Alguma sugestão?