Características del lenguaje mql5, sutilezas y técnicas - página 145

 
TheXpert:

Creo que el segundo número tiene un formato doble no válido, pero sigue siendo validado tanto en la impresora como en las operaciones.

Válido.

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

Válido.

Compara como mostré en el ejemplo anteriorNum!=Num- si es verdadero, entonces este doble es inválido, pero lo que Print() escribe allí ... bueno, es como un misterio detrás de los siete sellos

 
Igor Makanu:

Compara como mostré en el ejemplo anteriorNum!=Num- si es verdadero, entonces este doble es inválido, y lo que Print() escribe allí ... Bueno, es como un secreto detrás de los siete secretos.

Por supuesto, es falso. Este es un número normal. NaN no tiene nada que ver con el tema.

 
fxsaber:


sí, MathIsValidNumber dice verdadero.

 
TheXpert:

sí, MathIsValidNumber dice verdadero.

Así es como se obtiene este número mediante el cálculo.

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

Creo que estamos sobre el límite de la precisión doble

UPD:

así es:

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:
No entiendo esto.


DBL_MIN es un doble positivo no mínimo.

DBL_MIN devuelve un número normalizado, por debajo hay desnormalizados

#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

 

De todos modos, hemos establecido, supongo, la conocida afirmación de que hay enteros positivos menores que DBL_MIN.

#define  DBL_MIN_CORRECT (5 e-324) // Минимальное положительное double-значение
 
fxsaber:
En cualquier caso, habremos comprobado la conocida afirmación de que existen enteros positivos menores que DBL_MIN.

así que sí... pero la cuestión de dividir por cero sigue abierta?

El número 4,940656458412465e-324 no es definitivamente cero, y dividir por tales números está prohibido?

 
Igor Makanu:

así que sí... pero la cuestión de dividir por cero sigue abierta, ¿no?

Estaba cerrado desde el primer puesto. Cuando un número mínimo se multiplica por algo menor que uno, se obtiene el cero.