Características da linguagem mql5, subtilezas e técnicas - página 145

 
TheXpert:

Penso que o segundo número tem um formato duplo inválido, mas ainda é validado tanto na impressora como nas operações.

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.

Comparar como mostrei no exemplo acimaNum!=Num- se for verdade, então este duplo é inválido, mas o que Print() escreve ali ... bem, é como um mistério por detrás dos sete selos

 
Igor Makanu:

Comparar como mostrei no exemplo acimaNum!=Num- se for verdade, então este duplo é inválido, e o que Print() escreve ali ... Bem, é como um segredo por detrás dos sete segredos.

É claro que é falso. Este é um número normal. NaN não está de todo sobre o assunto.

 
fxsaber:


sim, MathIsValidNumber diz que é verdade.

 
TheXpert:

sim, MathIsValidNumber diz que é verdade.

É assim que este número é obtido através de cálculos.

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

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

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

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

Acho que estamos acima do limite da precisão, o dobro

UPD:

é isso mesmo:

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:
Não compreendo esta.


DBL_MIN é um duplo positivo não-mínimo.

DBL_MIN devolve um número normalizado, abaixo há desnormalizado

#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 qualquer modo, estabelecemos, penso eu, a bem conhecida afirmação de que existem inteiros positivos menos do que o DBL_MIN.

#define  DBL_MIN_CORRECT (5 e-324) // Минимальное положительное double-значение
 
fxsaber:
De qualquer modo, devemos ter descoberto a bem conhecida afirmação de que existem inteiros positivos menos do que o DBL_MIN.

por isso sim... mas a questão da divisão por zero permanece em aberto?

O número 4.940656458412465e-324 não é definitivamente zero, e a divisão por tais números é proibida?

 
Igor Makanu:

por isso sim... mas a questão da divisão por zero ainda está em aberto, não está?

Foi encerrado logo a partir do primeiro posto. Quando um número mínimo é multiplicado por algo menos do que um, obtém-se zero.