向MQL4大师们提问。还是关于双倍比较。 - 页 8

 
SK. писал (а):
VBAG
我不会指望你这样做。

我把它收回。
很高兴我的怀疑是错误的。
 

TO SK。

你最清楚。我不认为MQL是一种编程语言。这就是这样一个DIALECT。

顺便说一下,我对其中的两件事感到厌恶。

1) 没有列举操作,即大括号。

2)返回--你对括号非常厌烦。

总而言之,各位做得很好。

Kernighan和Ritchie--为他们鼓掌。

 
VBAG писал (а):
我把这句话收回。
很高兴我的怀疑是错误的。


我们没有发生争执 :)

邓飞

我不认为MQL是一种编程语言。这就是这样一个DIALECT。

这可能是一个术语的问题。例如,我在MQL中发现了一个完整语言的所有属性。在任何情况下,它是少数几种允许交易者将其活动机械化和自动化的语言之一(明显是最好的一种)。 我认为这种语言是相当令人满意的,至少在其可能性多次超过大多数算法的需求的意义上(换句话说 - 如果有足够的深思熟虑的想法,并且已经有实现的手段)。
 
SK. писал (а):
...

现在的情况是,变量的初始值123.00000000000在计算中使用时可能变成122.999999999999。尽管自从这个变量被发现以来,它的值从来没有改变过,只是被程序要求参与其他计算。


这其实就是为什么会有这些大惊小怪的事情发生。这就是为什么我们决定尽可能在实际计算时使用NormalizeDouble(),最好是在if, for, while语句的条件下。

你确定你在说什么吗?如果你能说明你的知识来源?

那么我有这个问题要问你

1、如果问题出在记忆或读取变量上,如果返回值也被记忆或读取出错,NormalizeDouble()怎么能帮助?
2.为什么方案NormalizeDouble(value, digits)!"OC!NormalizeDouble(value, digits), 其中 !OC!- 即使它直接插入if中,也不总是有效吗?
3?你知道NormalizeDouble()是如何工作的吗(函数算法)?
我写了我的看法,你怎么看?

gravity001写道(a)。

...
我已经告诉过你关于规范化的问题。首先告诉我你为什么需要 应用它,然后是如何 应用 在哪里 应用。

这就是关键问题,不是吗?我自己也想了很久:"你输入双倍,你得到双倍"。 有什么可能改变呢?
我还没有找到确切的答案。但我想象它是这样的

双重a = 2.000000000000
双倍b = 2.000000000001
double c = 1.999999999999

所有这些变量都是不同的,并存储在内存中,精确到最后一位数字!
在这种情况下,我们自己定义符号(数字)。所有没有定义的东西都填上了零。

如果我们定义了double a = 2.0,而它在内存中被存储为2.0000001或1.9999999,很明显,NormalizeDouble()不会有帮助,因为它将返回一个不准确的值!
我认为这样的错误在记忆变量值时几乎不会发生。此外,我不认为数字2.0被故意存储为1.99999999999999999,因为每个字符(数字或点)都被存储在位串的特定位上因此,数字2.0被安全地存储为2.00000...00。

另一种情况是我们自己不确定征兆的时候。

a = 4.0;
b = 2.0;
c = a / b // -- "除法 "操作由处理器完成,或者说由协处理器完成,它用字符(数字)填充前台。

手术后,它可以。
最常见的是。
с = 2.000...0
с= 1.99999999...
с= 2.00000001...

即结果往往与真实值相差很小。

大的错误很少发生。
с = 2.3

在这里,有两种解释。
1)调用a或b时,部分位串在内存中受到影响,即变量a和b被改变。
2)在 "除法 "操作中发生错误。

我认为2)出现的频率最高。为什么我不知道。我认为这与协处理器旨在高度优化以至于无用的事实有关。

当把一个变量与数字2.000...00相比较时,相等显然会失败。不是所有的位子都会相等。

现在,NormalizeDouble()来帮助我们了
NormalizeDouble()将 "修复 "这个小错误!
由于误差往往非常小,所以用小的精度进行四舍五入总是会得到正确的结果。

这样看吧。
将数字a=2.111...11四舍五入到第二位数。
NormalizeDouble()将把2.11写进一个新的变量中,并在剩余的位子上填入0,而不是1!
我想它会是这样的。

double MyNormalizeDouble(double value, int digits)
{
     int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
                                                       с помощью которого мы из VALUE сделаем целое число
     double result = MathRound(factor * value) / factor;
     return(result);
}
在这里,我尽力解释为什么需要NormalizeDouble()。

直到最近,我还对这种解释完全满意,但最近我相信,这种方案并不总是有效的。

归一化的双倍数(a, 2)!NormalizeDouble(b, 2) 其中 !OC!- 是一个比较运算符。
虽然根据我的理解,它必须总是有效的
因此,我很乐意接受任何有理有据和可以理解的批评!
 
gravity001:
SK.写道:(a)。
...

现在的情况是,变量的初始值123.00000000000在计算中使用时可能变成122.999999999999。尽管自从这个变量被发现以来,它的值从来没有改变过,只是被程序要求参与其他计算。

这其实就是为什么会有这些大惊小怪的事情发生。这就是为什么我不得不在尽可能接近实际计算的地方使用NormalizeDouble(),最好是直接在if、for、while语句的条件下使用。

你确定你在说什么吗?如果你能指出你的知识来源?
我确信。你的知识来源是你自己在MQL4编程中的经验和对开发人员的咨询。
1、如果问题出在记忆或读取变量上,那么NormalizeDouble()如何帮助,如果返回值也被记忆或读取时出现错误?
NormalizeDouble()应该在比较操作之前立即应用。比较操作的结果是一个布尔类型的值,它不会被 "破坏"。
为什么要用NormalizeDouble(value, digits)方案!?NormalizeDouble(value, digits) , 其中 !OC! 是比较运算符,并不总是工作? 即使你直接将它插入if?
我没有这么说。这正是它的工作原理,这也是你应该做的。
3?你知道NormalizeDouble()(函数算法)是如何工作的吗?
不,我没有。请将其提交给开发商。
4、我写了我对这个问题的看法,你怎么看?
你的观点很有意思,但这个问题早就解决了。最好是使用开发人员的建议,不要重新发明轮子。
 
SK. писал (а):
重力001

为什么NormalizeDouble(value, digits) !OC!NormalizeDouble(value, digits) , 其中 !OC! 是一个比较运算符,并不总是工作,即使你把它直接插入到if?
我没有这么说。这正是它的工作方式,也是你应该做的。

这里有更多关于这个问题的意见

'又是关于比较两个双打',从第一个帖子开始就有1页!

整数 24.12.2006 15:23

不幸的是,NormalizeDouble(x-y,Digits)结构与NormalizeDouble(x,Digits)-NormalizeDouble(y,Digits)结构不完全相同。

Renat 24.12.2006 16:15

而且它不应该是相同的。第一条是正确的。

我认为这个结构是
如果(NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) !=0)
和建设
如果(NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
是相同的!

你怎么看?
 
gravity001:

Renat 24.12.2006 16:15

而且,它一定不是相同的。第一个说法是正确的。

我认为建筑
如果(NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) !=0)
和建设
如果(NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
是相同的!

你怎么看?


雷纳特的意见就没意思了?你对开发MT的公司的CEO的意见不感兴趣?

还是你像普希金童话中的老妇人?只是想--想--想--想!记住这个故事的结局。"鱼 "什么也没说,她摇着尾巴游向了蓝色的大海。他在海边等了很久才得到答案。他没有等待,他转身回到老妇人身边......"

 
SK. писал (а):
第一个是重力001


Renat 24.12.2006 16:15

而且,它一定不是相同的。第一条是正确的。

我认为建筑
如果(NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) !=0)
和建设
如果(NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
是相同的!

你怎么看?



雷纳特的意见就没意思了?你对开发MT的公司的CEO的意见不感兴趣?


还是你像普希金童话中的老妇人?只是想--想--想--想!记住这个故事的结局。"鱼 "什么也没说,她摇着尾巴游向了蓝色的大海。他在海边等了很久才得到答案。他没有等待,他转身回到老妇人身边......"



好吧,雷纳特说第一种方式是对的,第二种是错的,而你说第二种方式是对的,对吗?

2.为什么方案NormalizeDouble(value, digits)!"OC!NormalizeDouble(value, digits) , 其中 !OC! 是一个比较运算符,并不总是工作,即使你把它直接插入到if?
我没有这么说。这正是它的运作方式,也是它应该做的。
 

我这样说是为了进行或多或少的比较。

if (NormalizeDouble(x,Digits) > NormalizeDouble(y,Digits))

这意味着该类型的结构并不总是有效。

double a = NormalizeDouble(x,Digits);
double b = NormalizeDouble(y,Digits);
 
if (a > b)
  {
  ...
  }

NormalizeDouble()应该直接插入到运算符的头部,尽可能靠近计算比较操作的地方。

至于开发商的意见,我不打算反驳。

然后......那条线涉及到一个完全不同的结构。

 
SK. писал (а):

我这么说暗示了一个或多或少的比较。

if (NormalizeDouble(x,Digits) > NormalizeDouble(y,Digits))
我没有检查多或少,但我确实检查了平等。
我在使用这种结构时出现了比较错误。

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
为什么,你不知道吗?