NormalizarDuplo paradoxo - página 2

 
transcendreamer:
A quebra do padrão é que mesmo após a normalização ainda há caudas!
Não há rabos após a normalização... Não induza as pessoas em erro.
 
VOLDEMAR:
Sem caudas após a normalização... Não induza as pessoas em erro.

Eu não entro .... mas eu tenho

a situação é assim: eu normalizo um número duas vezes, escrevo-o em uma variável global do terminal, depois leio-o, normalizo novamente e recebo caudas!

finalmente - não tenho poder para pegar esses rabos - apenas os corto à força usando DoubleToStr(corrente,2)

 
transcendreamer:

Eu não entro .... mas eu tenho

a situação é assim: eu normalizo um número duas vezes, escrevo-o em uma variável global do terminal, depois leio-o, normalizo novamente e recebo caudas!

como resultado - sem energia para pegar esses rabos - eu apenas os peguei e cortei à força usando DoubleToStr(corrente,2)

Se você normalizar a variável em dobro, por exemplo, para 5 caracteres, então a variável armazenará 5 caracteres, no caso de impressoras de chuva e outras coisas, você converte a variável para um tipo de dados diferente, o que pode causar caudas.

Mas não há cauda em dobro após a normalização.

Para não ter um acidente, você precisa fazer a normalização nos pontos de aplicação, no decorrer dos cálculos você não precisa...

 
VOLDEMAR:

Se você normalizar uma variável dupla para 5 dígitos, por exemplo, a variável armazenará 5 dígitos, em caso de reimpressão e outras coisas, você converte a variável para outro tipo de dados e uma cauda pode aparecer como conseqüência.

mas não há cauda no duplo após a normalização.

Para não ter um acidente, a normalização deve ser feita nos pontos de aplicação, você não pode fazer isso no decorrer dos cálculos...

Isto é, se eu fizer, por exemplo, uma transformação
(string)current

então ele pode dar rabos exatamente durante esta conversão?

não sabia

obrigado!

 
transcendreamer:
Isto é, se eu fizer, por exemplo, uma transformação
(string)current

então ele poderia dar rabos precisamente neste processo de conversão?

não sabia.

Obrigado!

Sim, pode, DoubleToString(, 5) está correto
 
stringo:

NormalizeDouble funciona exatamente assim (e sempre funcionou assim desde o primeiro MQL)

O número é multiplicado por 10 para o poder dos dígitos, convertido em forma inteira (descartando a parte fracionária), e depois dividido por 10 para o poder dos dígitos

Qual é o problema aqui? Existe uma quebra de padrão?

A parte fracionária é jogada fora? O arredondamento é feito por.

NormalizeDuplo(1,25,1) = 1,3

 
Integer:

A parte fracionária é descartada? O arredondamento é realizado.

NormalizeDuplo(1,25,1) = 1,3

Sim. Esqueci de mencionar os arredondamentos. O arredondamento é aplicado quando se obtém um número inteiro.
 
transcendreamer:
Então, se eu fizer, por exemplo, uma conversão
(string)current

então poderia dar rabos precisamente neste processo de conversão?

não sabia.

obrigado!

Na verdade, não. Sistema binário != sistema decimal. As casas decimais binárias são 0,5 / 0,25 / 0,125 / 0,0625 / 0,03125, etc. Não é possível somar todos os dígitos decimais destes tijolos. Por exemplo, é impossível montar um número decimal exatamente 0,3 (você só pode montar um valor aproximado), em sistema binário será um pouco menos ou um pouco mais. É assim que esta cauda aparece.

Somente números divisíveis sem um restante por 1/2^cada potência são representados com precisão.

Em outras palavras, distorcemos números quando tentamos representar números decimais em formato binário.

 
Tal analogia:
Estamos acostumados ao fato de que não escrever exatamente o resultado de uma operação 1/3 terá que arredondar para cima. Mas no sistema ternário há uma representação exata da operação == 0,1. Se nosso sistema nativo fosse ternário e o PC funcionasse com decimal, ficaríamos surpresos com o lixo em pedaços ao converter de volta para ternário o número 0,1troic.
 
pavlick_:
Tal analogia:
Estamos acostumados a não anotar exatamente o resultado de uma operação de 1/3 que temos que arredondar para cima. Mas no sistema ternário há uma representação exata da operação == 0,1. Se nosso sistema nativo fosse ternário e o PC funcionasse com decimal, ficaríamos surpresos com o lixo em pedaços ao converter de volta para ternário o número 0,1troic.

Isso é verdade.

Mas por alguma razão, mesmo uma calculadora de um centavo pode ler um número da memória e devolver exatamente o que foi escrito ali.

Você escreve uma fração de 1,23 e volta exatamente 1,23 sem nenhuma cauda.

E aqui está o truque.

em teoria, o usuário deve estar livre de uma tal rotina como apresentar o número em formato binário

<modo desligado>.