エラー、バグ、質問 - ページ 705

 
Yedelkin:
そして、Print()の 不具合に関する疑問は、このままにしておきましょうか。:)
好きなように。
 
victorg:
何でもいいんです。

OKです。それなら度胸がつく。そこで、Print() 関数の説明には、 double型の データは、小数点以下16 桁の精度で出力する」と書かれています。実は、Print()関数は、やや丸みを帯びたデータを出力 することが判明しています。

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

OKです。それなら度胸がつく。そこで、Print() 関数の説明には、 double型の データは、小数点以下16 桁の精度で出力する」と書かれています。実は、Print() 関数を使うと、少し丸みを帯びたデータになって しまうことが判明したのです。

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0

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

123.4567890123456(7>5なので四捨五入)

説明通りのようです。ゼロが印刷されないのですが、故障でしょうか?
 
MetaDriver:
すべてが説明と合っているようです。ゼロが印刷されないのですが、何か問題でも?
Print()関数で「ドットの後の小数点 以下 16 桁まで正確なdouble 型のデータ」と表示されないというバグです。
 
Yedelkin:
Print()関数で「ドット以降小数点 以下 16 桁の精度を持つ double型の データ」が出力されないというバグが発生しました。

引き留める

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

引き留める

確認する手間が省けました。

//+------------------------------------------------------------------+
//|                                                      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));
  }
//+------------------------------------------------------------------+

まず、コンパイラが「暗黙のうちに『数値』から『文字列』に変換する victorg2.mq5 12 22」を生成します。

2番目。

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

 

完全なフォーマット制御を行うには、適切なPrintFormat関数を 使用します。

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
印刷のデフォルトは、2桁から4桁の通常の丸めモードです。ドキュメントを修正いたします。
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - Документация по MQL5
 

構造体へのポインタ(ハンドル)を与えてください(できれば静的なものを含む配列へのポインタも)。

クラスでのラッピングは、しばしば悪い解決策になります。

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)サイズオブ(SEmpty) = 0
 
MetaDriver:

構造体へのポインタ(ハンドル)を与えてください(できれば配列にも、静的なものも含めて)。

どのような意味で、なぜ?

 
Renat:

1.どのような意味で、そして

2.なぜ?

1.

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

構造体へのポインタの配列(アレイ)を作成する。その後の初期化で for(i){ S[i] = GetPointer(StaticStruct[i]); }.

2.意味のあるデータを強固に(詰めて)配列しておくこと。

OpenCLの生バッファへのデータ出力(またはDLLへの送信、ファイルへの書き込みなど)を扱う場合に重要。

同時に、データを書き換えることなく、データアクセスの順序を入れ替えることも可能です(ポインタのソート時など)。