Fehler, Irrtümer, Fragen - Seite 705

 
Yedelkin:
Und lassen wir die Frage nach den Fehlern von Print() offen? :)
Wie Sie wollen.
 
victorg:
Wie auch immer.

GUT. Dann werde ich die Nerven behalten. So heißt es in der Beschreibung der Funktion Print(), dass "Daten vom Typ double mit einer Genauigkeit von 16 Dezimalstellen nach dem Komma gedruckt werden". Es stellt sich nämlich heraus, dass die Funktion Print() etwas gerundete Daten ausgibt:

void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
  }

ND 0 victorg2 (EURUSD,M1) 11:04:42 Druck(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Druck(DoubleToString(b,16))=199.9999999999999716
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
Yedelkin:

GUT. Dann werde ich die Nerven behalten. So heißt es in der Beschreibung der Funktion Print(), dass "Daten vom Typ double mit einer Genauigkeit von 16 Dezimalstellen nach dem Komma gedruckt werden". Es stellte sich heraus, dass die Funktion Print() leicht gerundete Daten erzeugt:

ND 0 victorg2 (EURUSD,M1) 11:04:42 Druck(b)=200. 0

MP 0 victorg2 (EURUSD,M1) 11:04:42 Druck(DoubleToString(b,16))=199.999999999999999716

123.4567890123456(7>5, daher aufgerundet)

Es scheint so zu sein wie beschrieben. Was ist der Fehler? Werden keine Nullen gedruckt?
 
MetaDriver:
Alles scheint auf die Beschreibung zu passen. Wo liegt das Problem? Werden die Nullen nicht gedruckt?
Der Fehler besteht darin, dass die Funktion Print() nicht"Daten vom Typ double auf 16 Dezimalstellen nach dem Punkt genau" ausgibt.
 
Yedelkin:
Der Fehler besteht darin, dass die Funktion Print() nicht"Daten vom Typ double mit einer Genauigkeit von 16 Dezimalstellen nach dem Punkt" ausgibt.

siehe

 Print("Print(b)="+ b);
 
sergeev:

siehe

Ich habe mir nicht die Mühe gemacht, das zu überprüfen.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
void OnStart()
  {
   double a,b;
   a=7.0/200.0;
   b=7.0/a;
   //Print("Print(b)=",b);
   Print("Print(b)="+b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
  }
//+------------------------------------------------------------------+

Zunächst einmal erzeugt der Compiler "implizite Konvertierung von 'Zahl' nach 'String' victorg2.mq5 12 22".

Zweitens,

IS 0 victorg2 (EURUSD,M1) 17:46:45 Print(b)=200
PJ 0 victorg2 (EURUSD,M1) 17:46:45 Print(DoubleToString(b,16))=199.9999999999999716

 

Verwenden Sie die entsprechende PrintFormat-Funktion für eine vollständige Formatkontrolle:

void OnStart()
  {
   double a,b;
   a=7.0/200.0;
   b=7.0/a;
   printf("Format: %.15lf",b);
   PrintFormat("Format: %.15lf",b);
  }

Format: 199.999999999999970
Format: 199.999999999999970
Beim Drucken wird standardmäßig der normale Rundungsmodus mit zwei bis vier Ziffern verwendet. Wir werden die Dokumentation korrigieren.
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - Документация по MQL5
 

Bitte geben Sie Zeiger (Handles) auf Strukturen an (vorzugsweise auch auf Arrays, einschließlich statischer Arrays).

Das Einwickeln in Klassen ist oft eine schlechte Lösung:

struct SEmpty
  {
  };
  
class CEmpty
  {
  };
void OnStart()
  {
   Print("sizeof(SEmpty) = ",sizeof(SEmpty));   
   Print("sizeof(CEmpty) = ",sizeof(CEmpty));
  }
2012.04.07 20:49:38 SizeOf_Test (USDJPY,M30) sizeof(CEmpty) = 16
2012.04.07 20:49:38 SizeOf_Test (USDJPY,M30) sizeof(SEmpty) = 0
 
MetaDriver:

Bitte geben Sie Zeiger (Handles) auf Strukturen an (vorzugsweise auch auf Arrays, einschließlich statischer Arrays).

Was meinen Sie und warum?

 
Renat:

1. in welchem Sinne und

2. Warum?

1.

CEmpty  *C[];  // Это работает.
SEmpty  *S[];  // Error: 'SEmpty' - class type expected SizeOf_Test.mq5 19      1

Um Arrays von Zeigern auf Strukturen (Arrays) zu erstellen. mit anschließender Initialisierung for(i){ S[i] = GetPointer(StaticStruct[i]); }

2. solide (gepackte) Arrays mit aussagekräftigen Daten zu speichern.

Wichtig bei der Datenausgabe in OpenCL-Rohpuffern (oder beim Senden an DLL, Schreiben in Dateien usw.)

Gleichzeitig ist es möglich, Datenzugriffe neu zu ordnen (z. B. beim Sortieren von Zeigern), ohne die Daten neu zu schreiben.