Caractéristiques du langage mql5, subtilités et techniques - page 145

 
TheXpert:

Je pense que le deuxième nombre a un double format invalide, mais il est toujours validé dans l'imprimante et les opérations.

Valable.

#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:

Valable.

Comparez comme je l'ai montré dans l'exemple ci-dessusNum!=Num- si c'est vrai, alors ce double est invalide, mais ce que Print() écrit là ... Et bien, c'est comme un mystère derrière les sept sceaux.

 
Igor Makanu:

Comparez comme je l'ai montré dans l'exemple ci-dessusNum!=Num- si c'est vrai, alors ce double est invalide, et ce que Print() écrit là ... Eh bien, c'est comme un secret derrière les sept secrets.

Bien sûr, c'est faux. C'est un chiffre normal. NaN n'est pas du tout sur le sujet.

 
fxsaber:


Oui, MathIsValidNumber dit vrai.

 
TheXpert:

Oui, MathIsValidNumber dit vrai.

C'est ainsi que l'on obtient ce nombre par le calcul.

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 : vrai

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

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

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

Je pense que nous avons dépassé la limite de la double précision.

UPD :

c'est vrai :

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:
Je ne comprends pas celle-ci.


DBL_MIN est un double positif non minime.

DBL_MIN renvoie un nombre normalisé, en dessous il y a des nombres dénormalisés.

#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

 

Quoi qu'il en soit, nous avons établi, je suppose, l'affirmation bien connue selon laquelle il existe des entiers positifs inférieurs à DBL_MIN.

#define  DBL_MIN_CORRECT (5 e-324) // Минимальное положительное double-значение
 
fxsaber:
Quoi qu'il en soit, nous avons dû découvrir l'affirmation bien connue selon laquelle il existe des entiers positifs inférieurs à DBL_MIN.

donc oui... mais la question de la division par zéro reste ouverte ?

Le nombre 4.940656458412465e-324 n'est certainement pas zéro, et il est interdit de diviser par de tels nombres ?

 
Igor Makanu:

alors oui... mais la question de la division par zéro est toujours ouverte, n'est-ce pas ?

Il a été fermé dès le premier message. Lorsqu'un nombre minimal est multiplié par un nombre inférieur à un, on obtient zéro.