如果我们定义了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...
double MyNormalizeDouble(double value, int digits)
{
int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
с помощью которого мы из VALUE сделаем целое число
double result = MathRound(factor * value) / factor;
return(result);
}
我不会指望你这样做。
很高兴我的怀疑是错误的。
TO SK。
你最清楚。我不认为MQL是一种编程语言。这就是这样一个DIALECT。
顺便说一下,我对其中的两件事感到厌恶。
1) 没有列举操作,即大括号。
2)返回--你对括号非常厌烦。
总而言之,各位做得很好。
Kernighan和Ritchie--为他们鼓掌。
我把这句话收回。
很高兴我的怀疑是错误的。
我们没有发生争执 :)
我不认为MQL是一种编程语言。这就是这样一个DIALECT。
...
现在的情况是,变量的初始值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!
我想它会是这样的。
在这里,我尽力解释为什么需要NormalizeDouble()。
直到最近,我还对这种解释完全满意,但最近我相信,这种方案并不总是有效的。
因此,我很乐意接受任何有理有据和可以理解的批评!
...
现在的情况是,变量的初始值123.00000000000在计算中使用时可能变成122.999999999999。尽管自从这个变量被发现以来,它的值从来没有改变过,只是被程序要求参与其他计算。
这其实就是为什么会有这些大惊小怪的事情发生。这就是为什么我不得不在尽可能接近实际计算的地方使用NormalizeDouble(),最好是直接在if、for、while语句的条件下使用。
我确信。你的知识来源是你自己在MQL4编程中的经验和对开发人员的咨询。
NormalizeDouble()应该在比较操作之前立即应用。比较操作的结果是一个布尔类型的值,它不会被 "破坏"。
我没有这么说。这正是它的工作原理,这也是你应该做的。
不,我没有。请将其提交给开发商。
你的观点很有意思,但这个问题早就解决了。最好是使用开发人员的建议,不要重新发明轮子。
我没有这么说。这正是它的工作方式,也是你应该做的。
'又是关于比较两个双打',从第一个帖子开始就有1页!
不幸的是,NormalizeDouble(x-y,Digits)结构与NormalizeDouble(x,Digits)-NormalizeDouble(y,Digits)结构不完全相同。
而且它不应该是相同的。第一条是正确的。
我认为这个结构是
如果(NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) !=0)
和建设
如果(NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
是相同的!
你怎么看?
而且,它一定不是相同的。第一个说法是正确的。
我认为建筑
如果(NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) !=0)
和建设
如果(NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
是相同的!
你怎么看?
雷纳特的意见就没意思了?你对开发MT的公司的CEO的意见不感兴趣?
还是你像普希金童话中的老妇人?只是想--想--想--想!记住这个故事的结局。"鱼 "什么也没说,她摇着尾巴游向了蓝色的大海。他在海边等了很久才得到答案。他没有等待,他转身回到老妇人身边......"
而且,它一定不是相同的。第一条是正确的。
我认为建筑
如果(NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) !=0)
和建设
如果(NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
是相同的!
你怎么看?
雷纳特的意见就没意思了?你对开发MT的公司的CEO的意见不感兴趣?
还是你像普希金童话中的老妇人?只是想--想--想--想!记住这个故事的结局。"鱼 "什么也没说,她摇着尾巴游向了蓝色的大海。他在海边等了很久才得到答案。他没有等待,他转身回到老妇人身边......"
好吧,雷纳特说第一种方式是对的,第二种是错的,而你说第二种方式是对的,对吗?
我没有这么说。这正是它的运作方式,也是它应该做的。
我这样说是为了进行或多或少的比较。
这意味着该类型的结构并不总是有效。
即NormalizeDouble()应该直接插入到运算符的头部,尽可能靠近计算比较操作的地方。
至于开发商的意见,我不打算反驳。
然后......那条线涉及到一个完全不同的结构。
我这么说暗示了一个或多或少的比较。
我在使用这种结构时出现了比较错误。
为什么,你不知道吗?