Posição Tamanho Retornando Valor Negativo - página 3

 
JD4:

O acima foi uma resposta específica ao seu posto específico"MathRound retorna um duplo; número infinito de casas decimais". "

Mais uma vez, de acordo com a página de documentação.

"Valor de retorno

Valor arredondado até o número inteiro mais próximo."

Agora, uma resposta específica a esta parte do seu posto.

"O que a página diz, é o que ela faz". Ela é redonda. Nada a ver com a questão das múltiplas casas decimais."

Mais uma vez, releia a citação, ela diz que retorna "Valor arredondado até o inteiro mais próximo". Um inteiro, por definição, é um número inteiro, como em nenhuma casa decimal. E mais uma vez, se isto não for de fato o que realmente faz, então o código ou a descrição é quebrada, e um ou outro ou ambos precisam ser fixados pela MQ, ou então uma etiqueta de advertência afirmando que estas funções não funcionam como anunciado.

Se ele realmente retorna o tipo que é dado, mas no equivalente matemático ao valor inteiro mais próximo (como nos retornos 1,00000 de um 1,23456, e 1 == 1,00000) mas não retorna um tipo inteiro real, então a página de referência precisa especificar algo como "não muda o tipo de dado subjacente" ou alguma outra forma que seja claramente declarada.

A documentação da MetaQuotes é, na melhor das hipóteses, fraca.

Entretanto, dito isto, MathRound() retorna um duplo por definição:

Se o valor retornado for lido: "Valor dividido por 2" ainda seria um duplo.

Da mesma forma que "Valor arredondado até o inteiro mais próximo" ainda é um duplo.

A esperança que ajuda

 
honest_knave:

A documentação da MetaQuotes é, na melhor das hipóteses, fraca.

Entretanto, dito isto, MathRound() retorna um duplo por definição:

Se o valor retornado for lido: "Valor dividido por 2" ainda seria um duplo.

Da mesma forma que "Valor arredondado até o inteiro mais próximo" ainda é um duplo.

A esperança que ajuda

Para mim, "Valor arredondado até o inteiro mais próximo" não está claro que retorna nada além de um inteiro por causa da definição de inteiro. Entendo que é realmente como funciona, mas isso enfatizou meu ponto de vista de que o código e/ou o texto oficial da página está quebrado e precisa ser corrigido. Ou o código precisa ser ajustado para que retorne um tipo int, ou o texto da página precisa ser alterado. Nós, como usuários, não temos como fazer isso.O valor que você está recebendo o número a ser arredondado não muda, a menos que você o atribua de volta a essa variável. Como se você estivesse arredondando y com um valor de 1,3, e colocando-o em x, usando o texto acima, depois que a função estiver concluída, você esperaria que y ainda contenha 1.3, e x para conter 1, não 1,0. Em minha mente, e como estou lendo, arredondar significa arredondar para o item mais próximo ao qual você está tentando arredondar, não um valor equivalente a esse item. Talvez a frase "algo está perdido na tradução" seja muito apropriada aqui.
 
JD4:
Para mim, "Valor arredondado até o inteiro mais próximo" não está claro que retorna nada além de um inteiro por causa da definição de inteiro. Entendo que é realmente como funciona, mas isso enfatizou meu ponto de vista de que o código e/ou o texto oficial da página está quebrado e precisa ser corrigido. Ou o código precisa ser ajustado para que retorne um tipo int, ou o texto da página precisa ser alterado. Nós, como usuários, não temos como fazer isso.O valor que você está recebendo o número a ser arredondado não muda, a menos que você o atribua de volta a essa variável. Como se você estivesse arredondando y com um valor de 1,3, e colocando-o em x, usando o texto acima, depois que a função estiver concluída, você esperaria que y ainda contenha 1.3, e x para conter 1, não 1,0. Em minha mente, e como estou lendo, arredondar significa arredondar para o item mais próximo ao qual você está tentando arredondar, não um valor equivalente a esse item. Talvez a frase "algo está perdido na tradução" seja muito apropriada aqui.

Não sou fã da documentação, mas devo dizer que acho que eles têm sido consistentes a este respeito. Toda a documentação lista o tipo de dados devolvidos (int, double, bool etc.) no topo da página, a seção de valores devolvidos mais tarde nunca repete este tipo de dados. Além disso, neste caso, eles estão retornando exatamente o mesmo tipo de dado que é colocado dentro.

Em qualquer caso, se você estiver usando a diretiva de compilação #propriedade estrita, você deve receber um aviso:

 
honest_knave:

Não sou fã da documentação, mas devo dizer que acho que eles têm sido consistentes a este respeito. Toda a documentação lista o tipo de dados devolvidos (int, double, bool etc.) no topo da página, a seção de valores devolvidos mais tarde nunca repete este tipo de dados. Além disso, neste caso, eles estão retornando exatamente o mesmo tipo de dado que é colocado dentro.

Em qualquer caso, se você estiver usando a diretiva de compilação #propriedade estrita, você deve receber um aviso:


Comecei um tópico no fórum da MQL5.com em https://www.mql5.com/en/forum/61394 que, espero, acabará ajudando nesta questão de documentação. Talvez se conseguirmos pessoas suficientes por trás da idéia, a MQ nos deixará ajudar a corrigir o que até agora tem sido um problema para muitas pessoas. Espero que a MQ aceite a idéia, porque nós, como usuários, não podemos mudar nada.

@ knave & WH - Concordo plenamente com seus exemplos, mas ainda vejo aqui um problema, que ou não estou explicando claramente, ou sou uma das poucas pessoas que estão vendo isto como um problema. Para mim, seus exemplos estão provando meu lado deste tópico mais do que você pensa que eles estão provando seu lado.

knave, seu exemplo retornará um erro porque não está retornando o tipo de dado que deveria estar retornando, uma int. O fato de você estar lançando sua variável como uma int só torna mais fácil ver o problema com a função não funcionando corretamente.

O exemplo só usa um duplo como valor que está sendo enviado para a função. Nenhum de seus posts mostra que o tipo de dado retornado da função é um duplo, apenas que o exemplo está enviando um duplo.

O arredondamento é geralmente aceito para alterar o valor de um número específico para uma precisão menor. Penso que nisso todos nós podemos concordar.

Neste caso, não é diferente. A página especifica "arredondada para o inteiro mais próximo do valor numérico especificado". Ela lê que ela arredondará para uma precisão menor (int) a partir de outro valor. No exemplo usado, um duplo é enviado. Isso é tudo que é 100% claro.

 

Sinto muito JD4, você me perdeu totalmente...

JD4:

Nenhum de seus postos mostra que declara 100% claramente que o tipo de dados retornados da função é um duplo, apenas que o exemplo está enviando um duplo.

Isso é exatamente o que eu marquei com uma seta. Ela retorna um duplo (grande seta vermelha) e o parâmetro passado é também um duplo (sob minha seta). Dê uma olhada em qualquer função. OrderSend() retorna um int... OrderClose( ) retorna uma bool.... e MathRound() retorna um duplo

JD4:

knave, seu exemplo retornará um erro porque não está retornando o tipo de dado que deveria estar retornando, uma int. O fato de você estar lançando sua variável como uma int só torna mais fácil ver o problema com a função não funcionando corretamente.

A função está funcionando exatamente como anunciada.

Se você acha que é uma int (errada), você obtém isto:

Se você digitá-lo como uma int, você reconhece que está usando o tipo de dado errado:

Se você o tratar como um duplo (que é), você não tem nenhum aviso:

 
honest_knave:

Sinto muito JD4, você me perdeu totalmente...

Foi exatamente isso que eu marquei com uma seta. Ela retorna um duplo (grande seta vermelha) e o parâmetro passado também é um duplo (debaixo da minha seta). Dê uma olhada em qualquer função. OrderSend() retorna um int... OrderClose( ) retorna uma bool.... e MathRound() retorna um duplo

A função está funcionando exatamente como anunciado.

Se você acha que é uma int (errada), você entende isto:


Se você digitá-lo como uma int, você reconhece que está usando o tipo de dado errado:


Se você tratá-lo como um duplo (que é), você não tem nenhum aviso:

O exemplo é datilografia para retornar um duplo. Em seu exemplo de código de int RoundedNumber, você está digitando casting para retornar um int como o tipo de retorno. Isto não deve ser necessário, pois é suposto retornar um int, com base no que a página lhe diz. A linha no topo e a do valor de retorno diz que ele arredonda para um inteiro do valor especificado.Um inteiro, não importa quantas vezes dissermos diferentemente, não tem nenhuma casa decimal, frações, ou qualquer outra forma de representar números entre números inteiros, zero, e números inteiros negativos. Como o exemplo que coloquei acima, baseado nos documentos dados, enviar a função MathRound "1.3" deve retornar "1", não "1.0", pois "1.0" não é um inteiro, mas "1" é. (citações apenas para esclarecimento)

Digitá-lo como uma int mostra um erro porque a função subjacente opera contra o que a página diz que ela faz, não porque é suposto que ela retorne além de uma int. Se você tratá-la como um duplo (que pode ser mas não é suposto ser), então isso é apenas deixar a função incorreta continuar a operar contra o que está documentado para fazer, retornar um inteiro que foi arredondado do valor enviado para ela, que é um duplo.

Enviar um duplo para ser arredondado (da forma como o código é documentado agora) para um número inteiro e depois lançar ou armazenar o valor retornado para um tipo duplo não irá gerar erros porque é suposto estar retornando um int, e se você armazenar um int para um duplo, você não estará perdendo nenhuma precisão na conversão.Os erros estão lá para notificar o programador sobre perda potencial de precisão nos cálculos. Se você armazenar um duplo em um int, você esperará um erro como o que você está mostrando porque você está forçando-o a uma outra forma com menos precisão do que tinha antes.

Se a função MathRound não deve retornar um int, então o texto da página precisa ser alterado para que não diga que deve retornar um int. Meu problema nunca foi com a função fazendo algo diferente do que faz, a não ser que seja contrário ao que a página diz que deve fazer.Eles precisam corrigir ou o código da função para que ela retorne uma int como a página do documento diz ser, ou editar a página do documento para refletir que ela não necessariamente retorne uma int.

Editar: Fiz mais pesquisas tanto através de referências C++ como Java, pois o MQL é um pouco baseado em C++, e é sintaticamente similar ao Java e C++. C++ mostra em uma parte do documento(http://www.cplusplus.com/reference/cmath/round/)"Round to nearest Retorna o valor integral que está mais próximo a x, com caixas de meio caminho arredondadas a partir de zero". Mas mais tarde na página diz"Return Value O valor de x arredondado para a integral mais próxima (como um valor de ponto flutuante)."A documentação Java em http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html mostra o seguinte sobre os 2 métodos denominados round. Ambos (Java e C++) são funcionalmente equivalentes dentro de suas linguagens às funções MathRound e/ou round em MQL.

estático longo redondo(duplo a)
Retorna o tempo mais próximo ao argumento, com os laços arredondados para cima.
estático int redondo(bóia a)
Retorna o mais próximo ao argumento, com os laços arredondados para cima.
 

O MQL MathRound retorna um valor inteiro em um datatype flutuante. Certamente o que C++, ou funções de arredondamento Java faz é irrelevante. É trivial escrever sua própria função 'int round(double a)' em MQL, se você quiser uma.

Os (32bit)floats podem conter (16 bit)inteiros sem perda de precisão. O problema é que OP quer valor arredondado a duas casas decimais e espera que seja exato. Ele não será.

 
ydrol:

O MQL MathRound retorna um valor inteiro em um datatype flutuante. Certamente o que C++, ou funções de arredondamento Java faz é irrelevante. É trivial escrever sua própria função 'int round(double a)' em MQL, se você quiser uma.

Os (32bit)floats podem conter (16 bit)inteiros sem perda de precisão. O problema é que OP quer valor arredondado a duas casas decimais e espera que seja exato. Ele não será.

Eu saí do tópico com meus posts sendo especificamente sobre a função operando de certa forma, e estou pronto para postar essa discussão fora do tópico. Se essa discussão de função acabar indo para outro lugar, eu estou bem com isso.

Editar: Comecei um tópico para discussão contínua desta página do documento em conflito em https://www.mql5.com/en/forum/156174. Gum, eu respondi ao seu post abaixo nesse tópico.
 

JD4, você parece ser a única pessoa que está confusa com isso

HonestKnave apontou que a documentação mostra claramente que a função retorna um duplo. Um número inteiro representado como um duplo.

"arredondado para o inteiro mais próximo" não significa que seja convertido em um número inteiro

Se eu disser para cortar um pedaço de madeira com o mesmo comprimento de um pedaço de fio. A madeira ainda permanece madeira, ela não se transforma repentinamente em um pedaço de corda.

 
JD4:

A linha no topo e aquela no valor de retorno diz que ela se arredonda para um inteiro do valor especificado.

JD4:

precisa corrigir ou o código da função para que retorne um int como diz a página do documento, ou editar a página do documento para refletir que não necessariamente retorna um int. "Arredondado para o inteiro mais próximo" é exatamente isso, um inteiro.


Bem, não tenho certeza do que irá convencê-lo JD4. A documentação diz claramente, 100%, que a função retorna um número inteiro duplo. Você está lendo algo mais na descrição do valor retornado - ela nunca declara que retorna um inteiro.

Quando você olha a OrderSend() ela diz "Valor retornado": Retorna o número do ticket atribuído à ordem pelo servidor de negociação ou -1 se falhar. Para obter informações adicionais de erro, deve-se chamar a função GetLastError()".

O que significa, então, por número? Isso é meio vago, você não acha? Significam duplo? float? char? curto? int? longo? A resposta está no topo da página, como aquela grande flecha que eu afixei anteriormente. Esse é o formato padrão deles para onde você procura para ver o tipo de dado retornado. (note que eu não disse o valor dos dados retornados). Eu realmente não consigo pensar em um único exemplo na documentação onde a seção "valor retornado" menciona o tipo de dado.

Razão: