mql5言語の特徴、微妙なニュアンスとテクニック - ページ 145

 
TheXpert:

2番目の数字が無効なダブルフォーマットになっていると思いますが、プリンタ、オペレーションともに有効です。

有効です。

#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- もし真なら、このダブルは無効ですが、Print() はそこに何を書き込むのでしょうか ...まあ、七つの封印の謎のようなものだ

 
Igor Makanu:

上の例で示したように比較してくださいNum!=Num- もし真なら、このダブルは無効で、Print()はそこに何を書き込むか ...まあ、7つの秘密の裏側みたいなものですね。

もちろん、それは偽りである。これは普通の数字です。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 :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。

精度倍増の限界を超えているのでは?

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 は非最小の正の倍数である。

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 (5 e-324) // Минимальное положительное double-значение
 
fxsaber:
とにかく、DBL_MINより 小さい正の整数が存在するという、よく知られた文言はわかったはずだ。

そうそうが、ゼロで割るという疑問は残りますね?

4.940656458412465e-324という数字は絶対に0ではないし、そんな数字で割るのは禁じ手?

 
Igor Makanu:

そうそうが、ゼロで割るという問題はまだ残っていますよね?

最初の投稿からクローズドでした。最小の数字に1より小さいものをかけると、0になる。

理由: