错误、漏洞、问题 - 页 711 1...704705706707708709710711712713714715716717718...3184 新评论 Anatoli Kazharski 2012.04.09 14:32 #7101 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类,也许这适合你。 谢谢,我将研究它。 Yedelkin 2012.04.09 14:39 #7102 Rosh: 事实上,一个实数 存储在内存中的有效数字不超过17位。 试试这个例子,感受一下差异。 我们会在帮助中纠正描述。 是的,Renat在上面已经解释过,Print()输出的数据是精确到4位的双数类型,而不是点后的16 位小数。从用户的角度来看,这就是整个症结所在。 Rashid Umarov 2012.04.09 14:53 #7103 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()。 Yedelkin 2012.04.09 15:05 #7104 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个数字) Slava 2012.04.09 15:54 #7105 "在战斗条件下,π的数量可以高达4个"。DoubleToString的工作方式与打印机中的格式化略有不同(这是由CRT决定的)。DoubleToString将整数和小数部分 分别转换为字符串,其算法比标准格式化稍快。 Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float) www.mql5.com Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5 Yedelkin 2012.04.09 16:09 #7106 stringo: 在DoubleToString中,整数部分 和小数部分 被分别转换为字符串,其算法比标准格式化稍快。 但后来发现,存储在内存中 的有效数字要比17位多一点。否则,转换为字符串的整数和小数部分从何而来?也就是说,不管是Print()还是DoubleToString(),它们都是从某个地方获得数据的(如果我们具体讨论的是存储 "不超过17位有效数字的内存")。 ......当然,也许我被 "存储在内存中 "这句话吸引住了,由于我对存储实数的性质一无所知,所以我不太明白。 Slava 2012.04.09 16:24 #7107 Yedelkin: 但后来发现,存储在内存中 的有效数字略多于17位。否则,转换为字符串的整数和小数部分从何而来?也就是说,无论是Print()还是DoubleToString(),它们都是从某个地方获得数据的(如果我们具体讨论的是 "在内存中存储不超过17位有效数字")。 ......当然,也许是我迷上了 "存储在内存中 "这句话,由于我对存储实数的性质一无所知,所以我不太明白。有时会存储多达20位有效数字,但不保证。而且一般来说,整数部分的数字越大,小数部分 的精确度就越低。为什么需要16位小数?学术兴趣? Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float) www.mql5.com Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5 Yedelkin 2012.04.09 17:59 #7108 stringo:有时最多可存储20个有效数字,但不保证。而且一般来说,整数部分的数字越大,小数部分 的精确度就越低。为什么需要16位小数?学术兴趣?:)为了不玩破坏性的电话,让我们看看背景故事。这里Victorg 问了一个关于Print()函数的工作和它产生的值的问题。在这里,我向他展示了原因。 因为他不想为Print()函数的问题 而烦恼。我有胆量指出,Print()函数的描述 说:"双数类型的数据在打印时的精度为点后16 位小数。实际上,事实证明, Print() 函数 打印的数据有些圆滑 ,并附有一个具体的例子。然后进行了激烈的讨论,最后没有人能够反驳我的例子,雷纳特概述了第一个版本,并表示将对参考书 进行修正。几天后,罗氏提出了第二个版本,其中提到了数字17。在加入讨论后,你提出了第三个版本,即。"在DoubleToString中,整数和小数部分被分别转换为字符串,而且是通过比标准格式化稍快的算法",也就是说,这已经变成了一个算法速度的问题。然后我提请你注意,一般来说,它与罗氏第二版的存储数字的大小差不多。stringo。为什么需要16位小数?学术兴趣?现在你可以回答这些问题了。我举了一个Print()函数输出圆形数据的例子。 我没有问这种行为的原因。我的例子没有被反驳,但我只是被建议使用不同的函数,并开始解释原因。而在这些解释中,出现了小数点后16(17)位的提法。 由于这些解释中的内容我并不清楚,所以我 "边走边问"。- 因此,这甚至不是我的学术兴趣,而只是想了解这个想法要传达给我的东西。 Victor 2012.04.11 07:27 #7109 Yedelkin:. . .因此,这甚至不是我的学术兴趣,而只是想了解我想表达的信息。 我非常同意。学术兴趣与此毫无关系。在文档中阅读"实数"。IEEE 标准754,表中有 15位有效数字 的双 。考虑到这一点,有四个选项--15、16、17位有效数字,以及整数部分和小数部分分别存储的选项。但它并不像那样工作!学术兴趣与此有什么关系?它更多的是关于初级形式逻辑,顺便说一下,它是这种编程语言的基础。在我看来,程序员应该写程序,而不是调查编译器。PS我想借此机会澄清一下。如果我使用ArrayResize()函数增加一个动态数组的大小,是否能保证 以前放在其中的数据会被保留下来?也许这一点应该在文档中明确提及(在ArrayResize()函数描述中)。如果有人知道,请告知。 Rashid Umarov 2012.04.11 11:14 #7110 victorg:如果我用ArrayResize()增加一个动态数组的 大小,是否能保证 以前放在里面的数据会被保留下来?也许这一点应该在文档中明确提及(在ArrayResize()函数的描述中)。如果有人知道,请告知。 当尺寸增加时,它们将是,否则这样的函数就没有意义了。 1...704705706707708709710711712713714715716717718...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
使用类。
是的,这是正确的。我没有意识到。我都不记得了,以前有人建议过。
结果就是这样。
看一下重载操作 部分,例如CMatrix类,也许这适合你。
事实上,一个实数 存储在内存中的有效数字不超过17位。
试试这个例子,感受一下差异。
我们会在帮助中纠正描述。是的,Renat在上面已经解释过,Print()输出的数据是精确到4位的双数类型,而不是点后的16 位小数。从用户的角度来看,这就是整个症结所在。
是的,Renat在上面已经解释过,Print()将双数类型的数据 输出到4位,而不是到 点后的16 位小数。从用户的角度来看,这就是问题所在。
不,Print()以%.16G 格式打印,这意味着它将尝试打印一个带有点和16个有效数字的数字。在这种情况下,存储的数字是199.999999999997,有17位有效数字(小数点前3位+小数点后14位)。当我试图打印16位数字时,四舍五入开始了,7被四舍五入到10,一个人到高位,9就到了。 多米诺骨牌原理开始了,打印的数字被四舍五入到200。
试举一例。
请看PrintFormat()。
不,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
"在战斗条件下,π的数量可以高达4个"。
DoubleToString的工作方式与打印机中的格式化略有不同(这是由CRT决定的)。
DoubleToString将整数和小数部分 分别转换为字符串,其算法比标准格式化稍快。
在DoubleToString中,整数部分 和小数部分 被分别转换为字符串,其算法比标准格式化稍快。
但后来发现,存储在内存中 的有效数字要比17位多一点。否则,转换为字符串的整数和小数部分从何而来?也就是说,不管是Print()还是DoubleToString(),它们都是从某个地方获得数据的(如果我们具体讨论的是存储 "不超过17位有效数字的内存")。
......当然,也许我被 "存储在内存中 "这句话吸引住了,由于我对存储实数的性质一无所知,所以我不太明白。
但后来发现,存储在内存中 的有效数字略多于17位。否则,转换为字符串的整数和小数部分从何而来?也就是说,无论是Print()还是DoubleToString(),它们都是从某个地方获得数据的(如果我们具体讨论的是 "在内存中存储不超过17位有效数字")。
......当然,也许是我迷上了 "存储在内存中 "这句话,由于我对存储实数的性质一无所知,所以我不太明白。
有时会存储多达20位有效数字,但不保证。而且一般来说,整数部分的数字越大,小数部分 的精确度就越低。
为什么需要16位小数?学术兴趣?
有时最多可存储20个有效数字,但不保证。而且一般来说,整数部分的数字越大,小数部分 的精确度就越低。
为什么需要16位小数?学术兴趣?
:)为了不玩破坏性的电话,让我们看看背景故事。
这里Victorg 问了一个关于Print()函数的工作和它产生的值的问题。
在这里,我向他展示了原因。
因为他不想为Print()函数的问题 而烦恼。
我有胆量指出,Print()函数的描述 说:"双数类型的数据在打印时的精度为点后16 位小数。实际上,事实证明, Print() 函数 打印的数据有些圆滑 ,并附有一个具体的例子。
然后进行了激烈的讨论,最后没有人能够反驳我的例子,雷纳特概述了第一个版本,并表示将对参考书 进行修正。
几天后,罗氏提出了第二个版本,其中提到了数字17。
在加入讨论后,你提出了第三个版本,即。"在DoubleToString中,整数和小数部分被分别转换为字符串,而且是通过比标准格式化稍快的算法",也就是说,这已经变成了一个算法速度的问题。
然后我提请你注意,一般来说,它与罗氏第二版的存储数字的大小差不多。
为什么需要16位小数?学术兴趣?
现在你可以回答这些问题了。我举了一个Print()函数输出圆形数据的例子。 我没有问这种行为的原因。我的例子没有被反驳,但我只是被建议使用不同的函数,并开始解释原因。而在这些解释中,出现了小数点后16(17)位的提法。 由于这些解释中的内容我并不清楚,所以我 "边走边问"。- 因此,这甚至不是我的学术兴趣,而只是想了解这个想法要传达给我的东西。
. . .因此,这甚至不是我的学术兴趣,而只是想了解我想表达的信息。
我非常同意。学术兴趣与此毫无关系。
在文档中阅读"实数"。IEEE 标准754,表中有 15位有效数字 的双 。考虑到这一点,有四个选项--15、16、17位有效数字,以及整数部分和小数部分分别存储的选项。但它并不像那样工作!学术兴趣与此有什么关系?它更多的是关于初级形式逻辑,顺便说一下,它是这种编程语言的基础。
在我看来,程序员应该写程序,而不是调查编译器。
PS
我想借此机会澄清一下。
如果我使用ArrayResize()函数增加一个动态数组的大小,是否能保证 以前放在其中的数据会被保留下来?也许这一点应该在文档中明确提及(在ArrayResize()函数描述中)。如果有人知道,请告知。
如果我用ArrayResize()增加一个动态数组的 大小,是否能保证 以前放在里面的数据会被保留下来?也许这一点应该在文档中明确提及(在ArrayResize()函数的描述中)。如果有人知道,请告知。