mql5语言的特点、微妙之处以及技巧 - 页 145

 
TheXpert:

我认为第二个数字有无效的双倍格式,但它在打印机和操作中仍然是有效的。

有效。

#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()在那里写 的是...嗯,这就像七个秘密背后的一个秘密。

当然,这是假的。这是一个正常的数字。NaN根本不在这个主题上。

 
fxsaber:


是的,MathIsValidNumber 说是真的。

 
TheXpert:

是的,MathIsValidNumber说是真的。

这个数字就是这样通过计算得到的。

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.940656458412465-323 : true

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 4.940656458412465-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 的正整数。

所以是的...但除以0的问题仍未解决?

4.940656458412465e-324这个数字肯定不是零,除以这样的数字是禁止的?

 
Igor Makanu:

所以是的...但除以0的问题仍未解决,不是吗?

从第一个帖子开始,它就被关闭了。当一个最小的数字与小于1的东西相乘时,你会得到0。