Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 145

 
TheXpert:

Penso che il secondo numero abbia un formato doppio non valido, ma è ancora convalidato sia nella stampante che nelle operazioni.

Valido.

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

void OnStart()
{
  double Num = 0;
  
  _W(Num) = (uchar)1;
  
  for (int i = 0; i < 324; i++)
    Num *= 10;
    
  Print(Num); // 4.940656458412466
}
 
fxsaber:

Valido.

Confronta come ho mostrato nell'esempio sopraNum!=Num- se vero, allora questo doppio non è valido, ma ciò che Print() scrive lì ... beh, è come un mistero dietro i sette sigilli

 
Igor Makanu:

Confronta come ho mostrato nell'esempio sopraNum!=Num- se è vero, allora questo doppio non è valido, e ciò che Print() scrive lì ... Beh, è come un segreto dietro i sette segreti.

Naturalmente, è falso. Questo è un numero normale. NaN non è affatto sull'argomento.

 
fxsaber:


Sì, MathIsValidNumber dice vero.

 
TheXpert:

Sì, MathIsValidNumber dice vero.

Ecco come si ottiene questo numero attraverso il calcolo.

void OnStart()
{
  double Num = 5;
    
  for (int i = 0; i < 324; i++)
    Num /= 10;
    
  Print(0.1 * Num == 0); // true
}
 
void OnStart()
{
  double Num = 5;
    
  for (int i = 0; i < 324; i++)
   { Num /= 10;
    
  Print(Num, " : ", 0.1 * Num == 0); // true
  }
  Print(Num!=Num);
  Print(DBL_MIN);
}

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 4.940656458412465e-323 : true

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 4.940656458412465e-324 : true

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) false

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 2.225073858507201e-308

Penso che siamo oltre il limite della doppia precisione

UPD:

Proprio così:

void OnStart()
{
  double Num = 5;
    
  for (int i = 0; i < 324; i++)
   { Num /= 10;
    
//  Print(Num, " : ", 0.1 * Num == 0); // true
  Print(Num, " : ",Num - DBL_MIN > 0.0 );
  }
  Print(Num!=Num);
  Print(DBL_MIN);
}
//_______________________________________________________________________
 
fxsaber:
Questo non lo capisco.


DBL_MIN è un doppio positivo non minimo.

DBL_MIN restituisce un numero normalizzato, sotto ci sono denormalizzati

#include <limits>
#include <iostream>
using namespace std;

int main() {
        cout << numeric_limits<double>::min() << "  " << numeric_limits<double>::denorm_min() << endl;
}

2.22507e-308 4.94066e-324

 

Comunque, abbiamo stabilito, credo, la nota affermazione che ci sono interi positivi minori di DBL_MIN.

#define  DBL_MIN_CORRECT (5 e-324) // Минимальное положительное double-значение
 
fxsaber:
Comunque, dobbiamo aver scoperto la nota affermazione che esistono interi positivi minori di DBL_MIN.

quindi sì... ma la questione della divisione per zero rimane aperta?

Il numero 4,940656458412465e-324 non è sicuramente zero, e dividere per tali numeri è vietato?

 
Igor Makanu:

quindi sì... ma la questione della divisione per zero è ancora aperta, vero?

È stato chiuso fin dal primo post. Quando un numero minimo viene moltiplicato per qualcosa di meno di uno, si ottiene zero.