Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 145

 
TheXpert:

Ich glaube, die zweite Zahl hat ein ungültiges doppeltes Format, aber sie wird trotzdem sowohl im Drucker als auch in den Operationen validiert.

Gültig.

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

Gültig.

Vergleiche wie im obigen BeispielNum!=Num- wenn true, dann ist dieser Double ungültig, aber was Print() da schreibt ... Nun, es ist wie ein Geheimnis hinter den sieben Siegeln

 
Igor Makanu:

Vergleichen Sie, wie ich im obigen Beispiel gezeigt habe,Num!=Num- wenn true, dann ist dieser Double ungültig, und was Print() da schreibt ... Nun, es ist wie ein Geheimnis hinter den sieben Geheimnissen.

Das ist natürlich falsch. Dies ist eine normale Zahl. NaN hat mit dem Thema nichts zu tun.

 
fxsaber:


ja, MathIsValidNumber sagt true.

 
TheXpert:

ja, MathIsValidNumber sagt true.

So wird diese Zahl durch Berechnung ermittelt.

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

Ich denke, wir sind über die Grenze der Genauigkeit hinaus doppelt

UPD:

Das ist richtig:

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:
Das verstehe ich nicht.


DBL_MIN ist ein nicht minimaler positiver Double.

DBL_MIN gibt eine normalisierte Zahl zurück, darunter gibt es denormalisierte

#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

 

Wie auch immer, wir haben die wohlbekannte Aussage getroffen, dass es positive ganze Zahlen gibt, die kleiner sind als DBL_MIN.

#define  DBL_MIN_CORRECT (5 e-324) // Минимальное положительное double-значение
 
fxsaber:
Wie auch immer, wir müssen die bekannte Aussage herausgefunden haben, dass es positive ganze Zahlen gibt, die kleiner sind als DBL_MIN.

also ja... aber die Frage der Teilung durch Null bleibt offen?

Die Zahl 4,940656458412465e-324 ist definitiv nicht Null, und die Division durch solche Zahlen ist verboten?

 
Igor Makanu:

also ja... aber die Frage der Division durch Null ist noch offen, nicht wahr?

Sie war vom ersten Beitrag an geschlossen. Multipliziert man eine Mindestzahl mit etwas, das kleiner als eins ist, erhält man Null.