Особенности языка mql5, тонкости и приёмы работы - страница 145

 
TheXpert:

Думаю у второго числа невалидный double формат, но оно все равно валидируется и в принте и в операциях. возможно из-за этого и сыплется.

Валидный.

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

Валидный.

сравните как я в примере выше показал Num!=Num - если истина, то этот double невалиден, а то что там Print() пишет ... ну как бы тайна за семью печатями

 
Igor Makanu:

сравните как я в примере выше показал Num!=Num - если истина, то этот double невалиден, а то что там Print() пишет ... ну как бы тайна за семью печатями

Конечно, false. Это нормальное число. NaN не по теме совсем.

 
fxsaber:


да, MathIsValidNumber говорит true.

 
TheXpert:

да, MathIsValidNumber говорит true.

Вот так это число получается через вычисления.

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

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

по моему вылетели за предел точности double

UPD:

так правильно:

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:
Вот этого не понял.


DBL_MIN - не минимальный положительный double.

DBL_MIN возвращает нормализованное число, ниже есть денормализованные

#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

 

В общем, выяснили, наверное, общеизвестное утверждение, что существуют полноценные положительные числа меньше DBL_MIN.

#define DBL_MIN_CORRECT (5e-324) // Минимальное положительное double-значение
 
fxsaber:
В общем, выяснили, наверное, общеизвестное утверждение, что существуют полноценные положительные числа меньше DBL_MIN.

так то да... но вопрос деления на ноль то остался открытым? 

число 4.940656458412465e-324 однозначно то не ноль, а деление на такие числа запрещено?

 
Igor Makanu:

так то да... но вопрос деления на ноль то остался открытым? 

Он был закрыт с первого же поста. Когда минимальное число умножается на что-то меньшее единицы, то получается ноль.

Причина обращения: