错误、漏洞、问题 - 页 711

 
sergeev:
使用类。

是的,这是正确的。我没有意识到。我都不记得了,以前有人建议过。

结果就是这样。

struct Buff { double b[]; };
//---
Buff lbuff[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=2,j=1000;
//---
   ArrayResize(lbuff,i);
   ArrayResize(lbuff[0].b,j);
   ArrayResize(lbuff[1].b,j);
  }
罗什
看一下重载操作 部分,例如CMatrix类,也许这适合你。
谢谢,我将研究它。
 
Rosh:

事实上,一个实数 存储在内存中的有效数字不超过17位。

试试这个例子,感受一下差异。

我们会在帮助中纠正描述。

是的,Renat在上面已经解释过,Print()输出的数据是精确到4位的双数类型,而不是点后的16 位小数。从用户的角度来看,这就是整个症结所在。

 
Yedelkin:

是的,Renat在上面已经解释过,Print()将双数类型的数据 输出到4位,而不是 点后的16 位小数。从用户的角度来看,这就是问题所在。

不,Print()以%.16G 格式打印,这意味着它将尝试打印一个带有点和16个有效数字的数字。在这种情况下,存储的数字是199.999999999997,有17位有效数字(小数点前3位+小数点后14位)。当我试图打印16位数字时,四舍五入开始了,7被四舍五入到10,一个人到高位,9就到了。 多米诺骨牌原理开始了,打印的数字被四舍五入到200。

试举一例。

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));
   double epsilon=MathPow(10,-13);
   Print("-------- После вычитания ",epsilon,"---------");
   b=b-epsilon;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));

   
  }

请看PrintFormat()。

 
Rosh:

不,Print()以%.16G 格式输出,这意味着它将试图输出一个带有句号和16个有效数字的数字。在这种情况下,存储的数字是199.99999999999997,有17位有效数字(小数点前3位+小数点后14位)。当我试图打印16位数字时,四舍五入开始了,7被四舍五入为10,一个人去找下一个更高的数字,9就在那里。 多米诺骨牌原理开始了,打印出来的数字被四舍五入为200。

看一下 PrintFormat()

现在我明白了为什么我们要关注被存储的有效数字的数量。

...但如果一个实数 存储不超过17位有效数字(在我们的例子中是199.999999999997),那么有效数字从何而来?

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

?(数了19个数字)
 

"在战斗条件下,π的数量可以高达4个"。

DoubleToString的工作方式与打印机中的格式化略有不同(这是由CRT决定的)。

DoubleToString将整数和小数部分 分别转换为字符串,其算法比标准格式化稍快。

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
stringo:

在DoubleToString中,整数部分 和小数部分 被分别转换为字符串,其算法比标准格式化稍快。

但后来发现,存储在内存中 的有效数字要比17位多一点。否则,转换为字符串的整数和小数部分从何而来?也就是说,不管是Print()还是DoubleToString(),它们都是从某个地方获得数据的(如果我们具体讨论的是存储 "不超过17位有效数字的内存")。

......当然,也许我被 "存储在内存中 "这句话吸引住了,由于我对存储实数的性质一无所知,所以我不太明白。

 
Yedelkin:

但后来发现,存储在内存中 的有效数字略多于17位。否则,转换为字符串的整数和小数部分从何而来?也就是说,无论是Print()还是DoubleToString(),它们都是从某个地方获得数据的(如果我们具体讨论的是 "在内存中存储不超过17位有效数字")。

......当然,也许是我迷上了 "存储在内存中 "这句话,由于我对存储实数的性质一无所知,所以我不太明白。

有时会存储多达20位有效数字,但不保证。而且一般来说,整数部分的数字越大,小数部分 的精确度就越低。

为什么需要16位小数?学术兴趣?

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
stringo:

有时最多可存储20个有效数字,但不保证。而且一般来说,整数部分的数字越大,小数部分 的精确度就越低。

为什么需要16位小数?学术兴趣?

:)为了不玩破坏性的电话,让我们看看背景故事。

这里Victorg 问了一个关于Print()函数的工作和它产生的值的问题。

在这里,我向他展示了原因

因为他不想为Print()函数的问题 而烦恼。

我有胆量指出,Print()函数的描述 说:"双数类型的数据在打印时的精度为点后16 位小数。实际上,事实证明, Print() 函数 打印的数据有些圆滑 ,并附有一个具体的例子。

然后进行了激烈的讨论,最后没有人能够反驳我的例子,雷纳特概述了第一个版本,并表示将对参考书 进行修正。

几天后,罗氏提出了第二个版本,其中提到了数字17。

在加入讨论后,你提出了第三个版本,即。"在DoubleToString中,整数和小数部分被分别转换为字符串,而且是通过比标准格式化稍快的算法",也就是说,这已经变成了一个算法速度的问题。

然后我提请你注意,一般来说,它与罗氏第二版的存储数字的大小差不多。

stringo

为什么需要16位小数?学术兴趣?

现在你可以回答这些问题了。我举了一个Print()函数输出圆形数据的例子。 我没有问这种行为的原因。我的例子没有被反驳,但我只是被建议使用不同的函数,并开始解释原因。而在这些解释中,出现了小数点后16(17)位的提法。 由于这些解释中的内容我并不清楚,所以我 "边走边问"。- 因此,这甚至不是我的学术兴趣,而只是想了解这个想法要传达给我的东西。

 
Yedelkin:

. . .因此,这甚至不是我的学术兴趣,而只是想了解我想表达的信息。

我非常同意。学术兴趣与此毫无关系。

在文档中阅读"实数"。IEEE 标准754,表中有 15位有效数字 。考虑到这一点,有四个选项--15、16、17位有效数字,以及整数部分和小数部分分别存储的选项。但它并不像那样工作!学术兴趣与此有什么关系?它更多的是关于初级形式逻辑,顺便说一下,它是这种编程语言的基础。

在我看来,程序员应该写程序,而不是调查编译器。

PS

我想借此机会澄清一下。

如果我使用ArrayResize()函数增加一个动态数组的大小,是否能保证 以前放在其中的数据会被保留下来?也许这一点应该在文档中明确提及(在ArrayResize()函数描述中)。如果有人知道,请告知

 
victorg:

如果我用ArrayResize()增加一个动态数组的 大小,是否能保证 以前放在里面的数据会被保留下来?也许这一点应该在文档中明确提及(在ArrayResize()函数的描述中)。如果有人知道,请告知

当尺寸增加时,它们将是,否则这样的函数就没有意义了。