Domanda ai maestri di MQL4. Di nuovo a proposito di Double Compare. - pagina 9

 
SK. писал (а):

L'ho detto nel senso di un paragone più o meno importante:

if (NormalizeDouble(x,Digits) > NormalizeDouble(y,Digits))

il che significa che le costruzioni di vista non sempre funzionano:

double a = NormalizeDouble(x,Digits);
double b = NormalizeDouble(y,Digits);
 
if (a > b)
  {
  ...
  }
Credo che la prima e la seconda abbiano lo stesso risultato.
I risultati assegnati alle variabili a e b sono normalizzati e poi possono essere confrontati, non gli succederà nulla.
Renat ha scritto qualcos'altro, perché in quell'esempio il risultato della sottrazione di valori normalizzati, a sua volta, non è normalizzato.
Se normalizzate il risultato finale di un'operazione, potete assegnarlo a una variabile e manipolarlo ulteriormente. La cosa principale è che la variabile stessa non deve cambiare il suo valore in seguito.
 
gravity001:
Non ho controllato il più o il meno, ma ho controllato l'uguaglianza.
Ho avuto errori di confronto quando ho usato questa costruzione:

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
Perché, non lo sai?

Che tipo di errori?
 
Simca:
E per me il primo e il secondo in termini di risultato UNO E UNO.

Questo funziona in alcuni casi, ma non sempre. Questo "non sempre" è dettato dal modo particolare in cui i valori vengono memorizzati nella memoria del computer. E' proprio questo.

I risultati assegnati alle variabili a e b sono normalizzati e possono essere confrontati ulteriormente, non gli succederà nulla.
Non si può. Cioè, potete fare quello che volete, ma per ottenere un risultato garantito, dovreste applicare NormalizeDouble() direttamente nell'espressione contenente l'operazione di confronto.

Renat ha scritto qualcos'altro, perché nel suo esempio il risultato della sottrazione di valori normalizzati non è normalizzato.
Sì, ma questo non significa che le sue precedenti affermazioni siano corrette.

Se normalizzate il risultato finale di un'operazione, potete assegnarlo a una variabile e manipolarlo ulteriormente. La cosa principale è che la variabile stessa non deve cambiare il suo valore più avanti.
Può cambiare il suo valore nell'ultima cifra a causa della specifica tecnologia informatica in uso. Questo può accadere e accade senza che l'utente se ne accorga. Questo è il punto. In alcuni casi funzionerà (per esempio, durante il debug di un programma), e quando si usa questo programma spesso funzionerà come previsto dallo sfortunato programmatore, e a volte non funzionerà.

 

Le mie sincere condoglianze agli sviluppatori che devono spiegare la stessa cosa 1000 volte ad ogni nuovo utente.

 
SK. писал (а):
gravità001:
Non ho controllato questa costruzione per il più o il meno, ma ho controllato per l'uguaglianza.
Ho avuto errori di confronto quando ho usato questa costruzione:

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
Perché, non lo sai?

Che tipo di errori?
La condizione non è soddisfatta, cioè l'uguaglianza non è soddisfatta?
Inoltre, perché pensate che l'errore sia nel memorizzare o leggere variabili doppie dalla memoria? Forse un errore nelle operazioni aritmetiche?

Pensa che non ci possa essere un errore in un caso simile?

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?
 
gravity001 писал (а):
На больше или меньше я не проверял эту конструкцию, а вот на равенство проверял.
У меня были ошибки при сравнении, когда я использовал такую конструкцию:

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
Почему, не знаете?

Si prega di dimostrare questo errore!!!!
 
gravity001:
La condizione non è soddisfatta, cioè l'uguaglianza non è soddisfatta?
Inoltre, perché pensate che l'errore sia nel memorizzare o leggere variabili doppie dalla memoria? Forse un errore nelle operazioni aritmetiche?

Pensate che non ci possa essere un errore in un caso simile:

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?

Credo che l'operazione di divisione sia eseguita correttamente.

La questione in discussione non riguarda come ottenere il valore di qualche variabile (che sia il valore ottenuto come risultato di calcoli o inizializzando la variabile), ma il destino del valore di quella variabile durante l'esecuzione del programma e anche solo il funzionamento del computer. E il suo destino è imprevedibile. Pertanto, quando si programmano operazioni logiche, si dovrebbe usare la funzioneNormalizeDouble().

Applicarlo è buono. Applicarlo correttamente è molto buono.

Non usarlo è un male. Uso scorretto - male.

---

In vacanza voglio...

 
SK. писал (а):
In alcuni casi funziona, ma non sempre. Questo "non sempre" è dettato dai modi particolari di memorizzare i valori nella memoria del computer. E' proprio questo.
Conosco i modi di memorizzare valori nella memoria del computer. :) Ho circa 20 anni di esperienza nella programmazione. Ho anche insegnato programmazione a studenti universitari in passato.

I risultati assegnati alle variabili a e b sono normalizzati e possono essere confrontati ulteriormente, non gli succederà nulla.
Non si può. Quindi, potete fare quello che volete, ma per ottenere un risultato garantito, dovreste applicare NormalizeDouble() proprio nell'espressione che contiene l'operazione di confronto.

Naturalmente, prima di poter confrontare il risultato del calcolo di un'espressione con qualcosa, bisogna normalizzarlo! Chi può discutere su questo?! Ma è irrilevante per il nostro argomento. Stavo parlando dell'identità del codice. La differenza è che nel secondo caso, i risultati della normalizzazione sono memorizzati in variabili. E QUESTO È TUTTO!

Cioè, voi sostenete che la funzione NormalizeDouble ha un risultato con una dimensione di bit superiore a double (il risultato di questa funzione occupa almeno un bit di memoria). Solo per questo posso spiegare qualsiasi perdita (o cambiamento) quando si salva il risultato di una funzione in una variabile, o quando si assegna, viene eseguita qualche operazione complicata, e non solo la duplicazione byte per byte dei dati da una cella di memoria all'altra.

Ancora una volta non sto discutendo la correttezza delle normalizzazioni separate degli operandi destro e sinistro dell'operazione di confronto o altro. Sto solo chiedendo se i risultati dei due frammenti di codice sopra sono identici.

Se normalizzate il risultato di un'operazione, potete assegnarlo a una variabile e operare ulteriormente su di essa. La cosa principale è che la variabile stessa non deve cambiare il suo valore più avanti.
Può cambiare il suo valore nell'ultima cifra a causa della specifica tecnologia informatica utilizzata. Questo può accadere e accade senza che l'utente se ne accorga. Questo è il punto. In alcuni casi funzionerà (per esempio, durante il debug di un programma), e quando si usa questo programma spesso funzionerà come previsto dallo sfortunato programmatore, e a volte non funzionerà.

WOW! E che tipo di "tecnologia informatica specifica" intende? Molte cose "passano inosservate" per l'utente, ma noi siamo, dopo tutto,programmatori. :) Niente deve passare inosservato per noi, altrimenti non sarà un computer ma un generatore di risultati imprevedibili. :) O forse il nostro computer ha già qualche bit errante? Possono leggere in un modo o nell'altro... Un'altra volta! Nelle operazioni aritmetiche con i numeri reali il risultatonon è infattiassolutamente esatto (ha a che fare con il modo in cui i numeri reali sono rappresentati). Ma questo non si applica alle operazioni di assegnazione. Una volta che la funzione NormalizeDouble ha lavorato e restituito un risultato di tipo double, questo risultato viene messo in una variabile semplicemente copiando il valore (tutti i byte saranno abbinati). Inoltre, mentre il valore della variabile rimane invariato (cioè è solo leggibile, ma non vi si scrive nulla), è conservato nella sua forma originale e non ci sono segni che fluttuano da nessuna parte. Leggetelo e otterrete la stessa cosa. Ma se si moltiplica semplicemente per 1 e si scrive il risultato, nulla è garantito.

 
SK. писал (а):

Le mie sincere condoglianze agli sviluppatori che devonospiegare la stessa cosa1000 volte ad ogni nuovo utente.

Questo è un attacco palese - penso che lo ignorerò. :)
 
gravity001:

Lei pensa che non ci possa essere un errore in un caso simile:

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?

In questo caso, il risultato dell'operazione sarebbe APPLICABILE 2.0
Un errore in cifre molto lontane può essere dovuto al modo in cui sono rappresentati i numeri reali.