Paradosso NormalizeDouble

 

Buon pomeriggio!

Per quanto abbia letto questa sezione della Guida, non riesco ancora a capire da dove viene quel frazionario 1 alla fine.

Tenete presente che quando un numero normalizzato viene emesso sul Journal usando Print(), potrebbe contenere più cifre decimali di quanto vi aspettate. Per esempio,

doppio a=76.671;// numero normalizzato con 3 cifre decimali
Print("Print(76.671)=",a);// stampalo così com'è
Print("DoubleToString(a,8)=",DoubleToString(a,8));// stampalo con la precisione specificata

viene emesso nel terminale:

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

 
transcendreamer:

Buon pomeriggio!

Per quanto abbia letto questa sezione della Guida, non riesco ancora a capire da dove viene quel frazionario 1 alla fine.

Tenete a mente che quando un numero normalizzato viene emesso sul Journal usando Print(), potrebbe contenere più cifre decimali di quanto vi aspettate. Per esempio,

doppio a=76.671;// numero normalizzato con 3 cifre decimali
Print("Print(76.671)=",a);// stampalo così com'è
Print("DoubleToString(a,8)=",DoubleToString(a,8));// stampalo con la precisione specificata

viene emesso nel terminale:

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

Il tipo doppio ha dei limiti di precisione a causa dei quali possono verificarsi degli errori.

Vi consiglio questo articolo: https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.
 
ENSED:

Il tipo doppio ha dei limiti di precisione, che possono portare a degli errori.

Vi consiglio questo articolo: https://www.mql5.com/ru/articles/1561

Vedo la raccomandazione, grazie.

Potete usare DoubleToStr quando emettete

ma non è chiaro da dove venga quello, in primo luogo!

Se stessi facendo una divisione/moltiplicazione, OK, va bene, è un errore.

Ma in una costante che mi sono prescritto?

Risulta che devo usare l'arrotondamento per una costante che inizialmente non ha questa precisione

e soprattutto, la fiducia in ciò che è effettivamente memorizzato nella doppia variabile è minata!

 

Citazione dalla documentazione

Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.

Per esempio, i numeri 0,3 e 0,7 sono rappresentati nel computer come frazioni infinite, mentre il numero 0,25 è memorizzato esattamente come una potenza di due.

 
stringo:

Citazione dalla documentazione

interessante...

Sto già indovinando che non è in MQL ma da qualche parte più in profondità, a livello di standard 80s

ma ancora molto strano...

Non l'ho visto in nessun altro linguaggio applicativo

sarebbe ragionevole avere alcuni workaround a livello del linguaggio MQL stesso

 

e ancora non spiega perché il codice qui sotto dà 0000000001 code

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

perché ho fatto la normalizzazione

e il numero è ancora in coda.

 
transcendreamer:

interessante...

Immagino già che non si tratti di MQL, ma da qualche parte più in basso, al livello degli standard degli anni 80

ma è ancora molto strano...

Non ho visto questo in nessun altro linguaggio applicativo

sarebbe ragionevole avere alcuni workaround a livello di MQL

Cosa c'è di così difficile?

Se avete bisogno di precisione fino a 4 cifre. Moltiplicare il numero per 10000, scartare la parte frazionaria e dividere per 10000.

Le funzioni matematiche di mql possono essere trovate nella documentazione.

 

text = "Posizioni chiuse a " + (string)current + " per il portafoglio: " + portfolio_name;

DoubleTo String per la corrente e sarete a posto

 

Sì, ho già capito che dobbiamo forzare l'arrotondamento

NormalizeDouble apparentemente non riesce a fare il lavoro

 
transcendreamer:

Sì, ho già capito che dobbiamo forzare l'arrotondamento

NormalizeDouble non sembra fare il lavoro

NormalizeDouble è esattamente come funziona (e ha sempre funzionato così, a partire dal primo MQL)

Un numero viene moltiplicato per 10 alla potenza delle cifre, convertito in forma intera (scartando la parte frazionaria), e poi diviso per 10 alla potenza delle cifre

Qual è il problema? Rompere lo schema?

 
stringo:

NormalizeDouble funziona esattamente così (e ha sempre funzionato così dal primo MQL)

Il numero viene moltiplicato per 10 alla potenza delle cifre, convertito in forma intera (scartando la parte frazionaria), e poi diviso per 10 alla potenza delle cifre

Qual è il problema? Rompere lo schema?

Una rottura del modello è che anche dopo la normalizzazione ci sono delle code!